以下代码的执行结果是什么?为什么?
class Father{
public int x = 10;
Father(){
this.print();
x=20;
}
public void print(){
System.out.println("Father.x="+x);
}
}
class Son extends Father{
public int x = 30;
Son(){
this.print();
x=40;
}
public void print(){
System.out.println("Son.x="+x);
}
}
public class test {
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.x);
}
}
Father类的定义:
class Father{
public int x = 10;
Father(){
this.print();
x = 20;
}
public void print(){
System.out.println("Father.x=" + x);
}
}
x在Father类中是一个实例变量,初始值为10。this.print()方法,然后将x设置为20。Son类的定义:
class Son extends Father{
public int x = 30;
Son(){
this.print();
x = 40;
}
public void print(){
System.out.println("Son.x=" + x);
}
}
Son类继承Father类,并重新定义了实例变量x,初始值为30。this.print()方法,然后将x设置为40。test类的main方法:
public class test {
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.x);
}
}
Son类的实例,并将其引用赋给Father类型的变量f。f.x的值。创建Son对象:
new Son()执行时,首先调用Father类的构造方法。Father类的构造方法中,this.print()实际调用的是Son类的print()方法,因为此时对象的实际类型是Son。Son类的实例变量x还未初始化,所以此时Son类的x的默认值为0,因此输出Son.x=0。Father类的构造方法继续执行,将Father类中的x设置为20。Son类的构造方法执行,this.print()再次调用Son类的print()方法,输出Son.x=30,因为此时Son类的x已经被初始化为30。Son类的构造方法将Son类的x设置为40。打印f.x:
f是Father类型的引用,所以访问的是Father类的x,即20。属性不存在多态性!!Son.x=0
Son.x=30
20