A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘海源 中级黑马   /  2012-7-26 22:25  /  1681 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是一哥们问的题我用图解和说明解答了一下不知道如何呢?????高手指点?谢谢
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, 下载次数: 19)

无标题.png

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

2 个回复

倒序浏览
在加载子类的时候,其实是先加载父类
然后再加载子类,子类持有一个父类的引用,那就是super引用
因为在子类创建时有一个隐式的super()声明
这就致使父类先加载进内存
至于方法的复写因为子类方法默认引用是this
所以调用的时候是自己复写的方法
但是这不代表父类的方法没有加载进内存
加载了只是没有调用它而已

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报

首先,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, 下载次数: 16)

继承

继承

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马