黑马程序员技术交流社区

标题: 继承问题在内存中的情况?? [打印本页]

作者: 刘海源    时间: 2012-7-26 22:25
标题: 继承问题在内存中的情况??
这是一哥们问的题我用图解和说明解答了一下不知道如何呢?????高手指点?谢谢
class A {

  void fun1() {

    System.out.println(fun2());

  }

  int fun2() {

    return 123;

  }

}

class B extends A {

  int fun2() {

    return 456;

  }

  public static void main(String argv[]) {

    A a;

    B b = new B();

        b.fun1();

    a = b;

        a.fun1();

  }

}
class A {

  void fun1() {

    System.out.println(fun2());

  }

  int fun2() {

    return 123;

  }

}

class B extends A {

  int fun2() {

    return 456;

  }

  public static void main(String argv[]) {

    A a;

    B b = new B();

        b.fun1();

    a = b;

        a.fun1();

  }

}
父类中的方法,子类在继承的时候在复制一份这个方法吗?也就是说子类和父类各自都有两个相同的方法
我的理解对吗?只有一个方法,这个方法是this在控制。还有父类被重写的方法和原父类的方法在加进内存的时候是怎么存在的?
因为子类复写了父类的方法所以调用的肯定是子类的方法,
但是父类必须有这个方法,因为编译看左边运行看右边奥
Person p=new Student();
假如Studet继承了Person类

无标题.png (42.82 KB, 下载次数: 16)

无标题.png

作者: 侯宪博    时间: 2012-7-27 02:21
在加载子类的时候,其实是先加载父类
然后再加载子类,子类持有一个父类的引用,那就是super引用
因为在子类创建时有一个隐式的super()声明
这就致使父类先加载进内存
至于方法的复写因为子类方法默认引用是this
所以调用的时候是自己复写的方法
但是这不代表父类的方法没有加载进内存
加载了只是没有调用它而已
作者: 王志明    时间: 2012-7-27 03:06

首先,A类里面有fun1,fun2方法,然后B类继承A类,B类里面也有fun1,fun2方法,但是你在B类里面覆盖了fun2方法,
所以当你调用fun1方法时,调用的是B类里继承后的fun2方法,
a = b;
a.fun1();
这两句使用到了java的多态机制,A类型的引用变量指向B类型的实例,所以运行是调用的是B的fun1方法(从A类继承)


Snip20120727_2.png (90.39 KB, 下载次数: 14)

继承

继承





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2