关于子类继承父类和调用构造器的问题
哪位高手帮忙看看输出是什么?我一直没搞懂,或者说不理解
class Parent {
int a = 55;
public void function() {
System.out.println( "Parent 's function() ");
}
Parent() {
function();
}
}
public class Child extends Parent {
int a = 15;
public static void main(String argv[]) {
Parent p = new Child();
System.out.println(p.a);
p.function();
}
public void function() {
System.out.println( "Child 's function() ");
}
}
------解决方案--------------------1,Parent p = new Child();执行完后输出:Child 's function()
2,System.out.println(p.a);执行完后输出:55
3,p.function();执行完后输出:Child 's function()
1和3由于,函数被重写了;
2是由于,变量没有被重写。
------解决方案--------------------学习 ~
------解决方案--------------------你重载了Parent的构造器,当然是执行子类了,你这样理解:
new Child()的时候,是在内存的堆中开辟了一段区域,而Parent p是个指针,是在栈中的,p仅仅是指向堆中内存的首地址而已。
明白了吗
------解决方案--------------------小白飘过,借搂主的帖子问点问题
如果function是因为在子类中被重写了才被调用那么那个a=15算不算重写,为什么没有被调用。
变量在子类中重新定义和方法重新定义区别在哪里。
------解决方案--------------------2和3明白,1还不是很懂。
为什么父类构造器里面的function()会去调用子类覆写的版本?
=========================================================
Parent p = new Child();这里new Clild();怎么会去调用父类的构造函数?跟谈不上function去调用什么子类的重写版本,这里直接就调用的子类的构造方法,只不过是子类的构造方法是系统给你默认的无参构造函数,是子类的构造函数调用父类的,不要弄翻了
这里的p在new之前,只是一个指向Parent的引用,但是它可以指向Parent的任何子类的对象地址(扯远了,成了C++).其实,你想一个动物可以代表一只鸡,也可以是一条狗,关键看你new 的后面是鸡类,还是狗类。这就是多态,不只是重载才能表现多态阿。
仅记者一条;p是一个引用,它指向这一类的对象的地址,这个地址里面是谁的对象,表面上它就是什么对象
------解决方案--------------------变量在子类中重新定义和方法重新定义区别在哪里。
=====================================================
应该说没区别,你如果在自己的类里定义了i,那么只能在你的这个类里用,该类的同级类仍然用基础类的i,不过你这类里面的所有i都不再是父类的i,如果想调用,只能是supper.i;或supper.geti();
------解决方案--------------------重载(overload)是在同一个类中的多个方法名相同的方法中
重写(overridden)是在继承的基础上,子类中方法的声明与父类相同,只有方法体不同。
当子类重写了父类的方法后,父类的方法就被子类方法隐藏了。
Parent p = new Child();
Parent p = new Parent();
这两句的p,只是声明一个引用变量,后面只是指向堆中的具体对象的地址。
这就是多态
------解决方案--------------------to 楼主:
刚才试验了一下把
Parent() {
function();
}
改成
Parent() {
this.function();
}
结果一样,然后设了断点跟踪了一下那个this,显示为child