public class Super {
int i = 0;
public Super(String a){
System.out.println("A");
i = 1;
}
public Super(){
System.out.println("B");
i += 2;
}
}
问题见注释。作者: lwy0319 时间: 2014-3-25 01:02
子类继承了父类的属性变量I,第一次父类构造变成了2,经过第二次子类构造变成了5,从头到尾都访问的是同一个I,不分父类和子类成员。将
public Test(String a){
System.out.println("C");
i = 5;
}
改成
public Test(String a){
System.out.println("C");
int i = 5;
}
那么结果将输出2作者: luoyilan222 时间: 2014-3-25 09:36
首先确定这句打印 System.out.println(t.i);的一定是Super类中的i,
1,当代码执行到这一句的时候Super t = new Test("A");先执行父类无参构造函数
public Super(){
System.out.println("B");
i += 2;
}
2,执行后i==1 然后再执行子类构造函数
1. public Test(String a){
2. System.out.println("C");
3. i = 5;
4. }
执行后 i == 5 ;
System.out.println(t.i);所以最后打印结果是 5 作者: 630681386@qq.co 时间: 2014-3-25 09:44
父类的引用是指向子类的对象,父类中没有i这个变量,就会调用子类的, 作者: 梦幻 时间: 2014-3-25 15:15
其实你可以把你的程序给做一下拆分你就会看的很清楚了,首先你在主函数中定义的 i 只是一个局部变量,不是类的成员变量,所以不算是你定义的子类中的你想要的那个变量 i ,下面的程序是我给你拆分的,你可以看一下拆分后的子类中并没有定义子类的成员变量 i ,也就是说子类中的函数中的 i 是继承了父类的。是父类中的成员变量 i ,
作者: H-Deka 时间: 2014-3-26 16:49
Super t = new Test("A"); 虽然是父类引用,但是是指向子类的,所以调用的还是子类的方法和属性作者: 清风木扬 时间: 2014-3-27 18:03
Super t = new Test("A"); // t变量指向的是一个Test对象。Test 继承Super的i变量(访问权限是default“同包子类时可以继承",“不同包时不可以”这里同包所以可以继承i) Test对象生成时,先执行了Super方法后i变2,后再执行自已的构造方法i变成5。
System.out.println(t.i);