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

© sd110572 金牌黑马   /  2013-12-6 09:55  /  1280 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class ClassB extends ClassA{

  2.         public static void main(String[] args) {
  3.                 new ClassB();
  4.         }
  5.        
  6.         public ClassB() {
  7.                
  8.         }
  9.        
  10.         public void action(){
  11.                 System.out.println("重写");
  12.         }
  13. }

  14. class ClassA{
  15.        
  16.         public ClassA() {
  17.                 action();
  18.         }
  19.         public void action(){
  20.                 System.out.println("父类");
  21.         }
  22. }
复制代码

为什么会调用子类重写的方法呢?明明是在父类的构造器里

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

5 个回复

倒序浏览
B类继承A类重写A类函数,
B类构造方法默认加载一个A类的构造方法
创建的是B类的对象,就调用子类重写的方法。
回复 使用道具 举报
因为你在加载子类的时候要先加载父类,这时候就要用到父类的构造函数,父类的构造函数调用了action()方法,而在子类中又复写了action方法,所以调用的是子类的action方法啊。要记住,子类在加载时,是参考父类的,所以父类也要加载.
回复 使用道具 举报
子类继承父类,new子类的时候初始化父类,此时父类构造函数调用show方法,此时是调用的子类的show方法,因为你new的是子类,父类持用子类的引用,不管你在父类还是其他类调用父类的方法都是掉用子类的方法
回复 使用道具 举报
继承。字面的含义就是。我没有,但是我的上级有。他们的就是我的。
那么 函数声明了继承的时候,就默认有了父类的一切。这是条件一
但是众所周知,
父类就是子类的共有特性抽取出来的。换句话说,子类是父类的延伸,有自己的特有内容
所以,子类和父类共有同样的方法时,
子类会把自己有的特有方法复写父类的方法变成自己特有内容,条件二
,大白话就是,有了父类的,但是子类有和父类一样方法名称但是不一样内容的,
你调用的又是子类。所以。出现了你的代码的结果

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
面向对象的伞大特征是:封装 、继承、多态。你的问题出在继承和多态中。
子类中出现与父类一模一样的方法时,会出现覆盖操作。
而且子类在实例化时,会先加载父类的字节码到内存,然后在加载自己的字节码到内存。
此时内存的方法区中就有两个action方法,一个父类的一个子类的。
此时多态就表现出来了
因为你创建的是子类,父类持用子类的引用,不管你在父类还是其他类调用父类的方法都是掉用子类的方法。
总之就是:函数在编译时期看父类有无定义,运行时期看子类的具体实现。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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