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.   

    class Father {
    private String s = "Father string";
    public Father() {
    System.out.println(this);
    System.out.println("Father constructor.");
    System.out.println(s);
    method();
    }
    public void method() {
    System.out.println("Father method");
    }
    }
    class Son extends Father {
    private String s = "Son string";
    public Son() {
    System.out.println("Son constructor");
    }
    public static void main(String[] args) {
    new Son();
    }
    public void method() {
    System.out.println("Son method");
    }
    }
      

  2.   

    其实,你的问题,只要打印出当前方法中的this是谁就可以了解了
      

  3.   

    你说的有是有道理,但是我是想知道为什么,要的不是这种答案!!!为什么到了父类this是子类的,要是想知道个结果,我还问什么啊!
    我大可不必打印,只要一this点就都出来了阿,看看是谁的句柄,里边的成员方法,和成员数据就知道了。。
    为什么要打印???晕,打出来的还是内存,你看得懂内存吗?反正我还是要谢谢你。
      

  4.   

    toangelleecash(感觉用汉语拼音打字倍儿有面子) 
    再有书写格式,我是在网站上手动打出得,又不是借助编辑工具,希望理解,我也想让他好看点,你在网页上,按下tab键好用吗?还有不不说多点,就会像你这样的回答出来了,光是结果,一个结果并不是答案。
      

  5.   

    回答如下:
       因为你在子类中已经完全重写(overriden)了父类中的方法run()所以子类调用时会调用子类的run()而不是父类中的run()。父类中的run()方法由于你若想调用,可以用上塑造型的方法去访问。你可以把子类的run()方法改个名字,那么它就只能调用父类的run()方法了。   把父类做下修改:
        private void run() {///////改动为私有成员
      
            System.out.println("运行*父类*run方法");
      
        }
    }
    那么你的父类中的run()方法就不会被继承,必然会调用父类的方法了。记住只用public和protected修饰的才能被继承。java中调用采用传递引用来实现方法调用。你可参考其他资料。
      

  6.   

    to>>angelleecash(感觉用汉语拼音打字倍儿有面子) 
    a.B@d9f9c3
    a.B@d9f9c3
    这个是父类和子类中打印出来的东西,是一样的呢你说明什么呢?
    说明this是子类的,那么把你的 父类的method()方法改为private的,是不是掉的还是子类的??既然this是子类的,那么在父类构造中this.method();应该打印Son method。但是事实却是Father method,这个你可以自己去试,我已经是过了,那么现在又说明this是父类的了,你不觉得矛盾吗???????
      

  7.   

    to>>freesnail() 
    我不是初学者,我当然知道这个了,再有你说 “上转型对象”是吧,上转型对象调用的是什么??上转型对象中包含的成员是 父类中继承的成员和子类重写了父类的成员,那么你说的上转型是错误的方法,他还是调用子类run()方法。
    把 子类改个名 你真有创意 这样我还有意了吗?改了之后,不是调用父类的run(),还是调用子类的,就像你说的run()被继承了,他调的是子类的,只不过在子类中你没有手写而已,其实run()还是客观存在于子类的,看来你这块没学好阿。