日期:2014-05-20  浏览次数:20798 次

关于子类继承父类和调用构造器的问题
哪位高手帮忙看看输出是什么?我一直没搞懂,或者说不理解

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