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

Java中的继承是运行时继承吗?看下面代码

import static TinkingJava.Print.*;
public class Testextends extends F{
public Testextends(){
print("j="+j);
}
public static void main(String[] args){
new Testextends();
}//输出j=99,这个值是在F的构造器里赋的,难道Java中是运行时继承?
}
class F{
protected int j;
public F(){
print("j="+j);
j=99;
print("j="+j);
}
}

如果是编译时继承,那子类的j应该等于初始值0啊!
------解决方案--------------------
构造子类对象的时候会先构造父类对象

就是说你的子类对象在执行print之前已经执行了父类的f()
------解决方案--------------------
子类构造函数开始时会先调用父类的构造函数
------解决方案--------------------
引用:
问题不在这,我知道先执行了父类构造函数不错,但是子类有自己的j啊,父类里改变j影响子类继承的j啊?问题是继承这个动作是发生在调用父类构造器之前还是之后?

编译时就确定了继承关系,子类有了j变量,但是运行父类的构造方法后j的值成了99
难道现在把父类改成98,你还想让子类输出99?99这个数是哪儿蹦出来的?
------解决方案--------------------
引用:
问题不在这,我知道先执行了父类构造函数不错,但是子类有自己的j啊,父类里改变j影响子类继承的j啊?问题是继承这个动作是发生在调用父类构造器之前还是之后?


子类的j继承自父类,在内存里是同一个
------解决方案--------------------
先执行父类的构造函数,子类再继承父类,父类的构造函数构造完时j已经变为99,所以子类也继续父类的这个j,为99
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:


问题不在这,我知道先执行了父类构造函数不错,但是子类有自己的j啊,父类里改变j影响子类继承的j啊?问题是继承这个动作是发生在调用父类构造器之前还是之后?

编译时就确定了继承关系,子类有了j变量,但是运行父类的构造方法后j的值成了99
难道现在把父类改成98,你还想让子类输出99?99这个数是哪儿蹦出来的?

既然是编译时就确定了继承关系,子类有了j变量,在F构造器里修改j之后怎么还影响子类的j,子类的j应该是默认值0啊

F构造器里修改j改的就是子类对象继承来的j,否则一个对象难道能有两个j变量?
------解决方案--------------------
肯定是先执行父类的构造函数,子类在继承父类的值,子类也可以覆写父类的函数
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:


问题不在这,我知道先执行了父类构造函数不错,但是子类有自己的j啊,父类里改变j影响子类继承的j啊?问题是继承这个动作是发生在调用父类构造器之前还是之后?

编译时就确定了继承关系,子类有了j变量,但是运行父类的构造方法后j的值成了99
难道现在把父类改成98,你还想让子类输出99?99这个数是哪儿蹦出来的?

既然是编译时就确定了继承关系,子类有了j变量,在F构造器里修改j之后怎么还影响子类的j,子类的j应该是默认值0啊


LZ应该区分开继承时机与构造函数的时机。编译时确定了继承关系,因此加载子类时也会把父类加载进内存,把成员的值都设置成默认值(如果定义时未初始化的话),此时j的值为0,且并未执行构造函数。当new一个对象时,执行子类构造函数,先调用父类的构造函数,因此分别输出0和99,执行子类的构造函数,输出99.