黑马程序员技术交流社区
标题:
构造器的问题
[打印本页]
作者:
sd110572
时间:
2013-12-6 09:55
标题:
构造器的问题
public class ClassB extends ClassA{
public static void main(String[] args) {
new ClassB();
}
public ClassB() {
}
public void action(){
System.out.println("重写");
}
}
class ClassA{
public ClassA() {
action();
}
public void action(){
System.out.println("父类");
}
}
复制代码
为什么会调用子类重写的方法呢?明明是在父类的构造器里
作者:
ZHMing
时间:
2013-12-6 10:06
B类继承A类重写A类函数,
B类构造方法默认加载一个A类的构造方法
创建的是B类的对象,就调用子类重写的方法。
作者:
┾——黑马
时间:
2013-12-6 10:07
因为你在加载子类的时候要先加载父类,这时候就要用到父类的构造函数,父类的构造函数调用了action()方法,而在子类中又复写了action方法,所以调用的是子类的action方法啊。要记住,子类在加载时,是参考父类的,所以父类也要加载.
作者:
王家胜
时间:
2013-12-6 16:52
子类继承父类,new子类的时候初始化父类,此时父类构造函数调用show方法,此时是调用的子类的show方法,因为你new的是子类,父类持用子类的引用,不管你在父类还是其他类调用父类的方法都是掉用子类的方法
作者:
air
时间:
2013-12-6 17:17
继承。字面的含义就是。我没有,但是我的上级有。他们的就是我的。
那么 函数声明了继承的时候,就默认有了父类的一切。这是条件一
但是众所周知,
父类就是子类的共有特性抽取出来的。换句话说,子类是父类的延伸,有自己的特有内容
所以,子类和父类共有同样的方法时,
子类会把自己有的特有方法复写父类的方法变成自己特有内容,条件二
,大白话就是,有了父类的,但是子类有和父类一样方法名称但是不一样内容的,
你调用的又是子类。所以。出现了你的代码的结果
作者:
wangchao1686
时间:
2013-12-6 17:37
面向对象的伞大特征是:封装 、继承、多态。你的问题出在继承和多态中。
子类中出现与父类一模一样的方法时,会出现覆盖操作。
而且子类在实例化时,会先加载父类的字节码到内存,然后在加载自己的字节码到内存。
此时内存的方法区中就有两个action方法,一个父类的一个子类的。
此时多态就表现出来了
因为你创建的是子类,父类持用子类的引用,不管你在父类还是其他类调用父类的方法都是掉用子类的方法。
总之就是:函数在编译时期看父类有无定义,运行时期看子类的具体实现。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2