首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

哪位高手来帮帮初学者

2012-01-22 
谁来帮帮菜鸟publicclassA{/***@paramargs*/privateStringsok A(intx){System.out.println( 调用父类

谁来帮帮菜鸟
public   class   A   {
        /**
          *   @param   args
          */
        private   String     s   =   "ok ";
 
        A(int   x){
   
                System.out.println( "调用父类构造函数 ");
                System.out.println( "调用私有成员变量 "   +   s);

                this.run();
   
        }
 
        public   void   run()   {
   
                System.out.println( "运行*父类*run方法 ");
   
        }
}

public   class   B   extends   A   {
        /**
          *   @param   args
          */
 
        B(int   x){
   
                super(0);

                System.out.println( "子类构造函数初始化完毕 "   );
   
        }
 
        public   void   run()   {
   
                System.out.println( "运行*子类*run方法 ");
   
        }

        public   static   void   main(String[]   args)   {
                //   TODO   Auto-generated   method   stub
                B   object_B   =   new   B(0);
   
        }

}

运行结果:
调用父类构造函数
调用私有成员变量ok
运行*子类*run方法
子类构造函数初始化完毕

我的问题是:
1.当子类对象实例化过程中通过super(0)显示的调用父类构造方法的时候,父类构造方法所调用的run()方法不是父类的吗?
2.父类构造方法中的run()方法的所属是谁的?子类还是父类?如果是父类的为什么会打印子类中run()方法打印的内容?如果是子类的,那么又是如何做到的?如何将子类对象的引用传进去的?
3.假设在父类中调用的run()方法是子类的引用调用的,那么把父类做下修改:
public   class   A   {
        /**
          *   @param   args
          */
        private   String     s   =   "ok ";
 
        A(int   x){
   
                System.out.println( "调用父类构造函数 ");
                System.out.println( "调用私有成员变量 "   +   s);

                this.run();
   
        }
 
        private   void   run()   {///////改动为私有成员
   
                System.out.println( "运行*父类*run方法 ");
   
        }
}
那么在这种情况下是不是不会影响到结果,因为既然引用句柄是子类的那么子类的run()方法没有发生变化,就应该不变(本人想法)。但事实是发生了变化
运行结果:


调用父类构造函数
调用私有成员变量ok
运行*父类*run方法
子类构造函数初始化完毕
这次却调用了父类的run()方法了,假设好像被推翻了。
我真的好像知道在父类的构造方法里发生了怎样的变化,JVM究竟是如何运行的?
4.我还想知道java在调用方法时是如何调用的,是如何实现方法的调用的,是将方法的代码加载到被调用的地方?还是将指针指向方法的地址?


[解决办法]
1 如果你把代码格式弄得好看点,会有更多人看
2 不要写太多东西,很多人没耐心的
然后回答你的问题
稍微等一下

[解决办法]
回答如下:
因为你在子类中已经完全重写(overriden)了父类中的方法run()所以子类调用时会调用子类的run()而不是父类中的run()。父类中的run()方法由于你若想调用,可以用上塑造型的方法去访问。你可以把子类的run()方法改个名字,那么它就只能调用父类的run()方法了。

把父类做下修改:
private void run() {///////改动为私有成员

System.out.println( "运行*父类*run方法 ");

}
}
那么你的父类中的run()方法就不会被继承,必然会调用父类的方法了。记住只用public和protected修饰的才能被继承。

java中调用采用传递引用来实现方法调用。你可参考其他资料。

热点排行