很简单的题目,我想不明白
class C{
int i=1;
}
class D extends C{
int i=2;
}
public class Test2 {
public static void main(String[] args) {
C c1=new D();
System.out.println(c1.i);
C c2=new D();
System.out.println(((D)c2).i);
}
}
运行结果是什么?为什么?谢谢
------解决方案--------------------输出结果是c1=1,c2=2,
因为c1、c2是new的子类的对象,他们同时就有了父类和子类的方法和属性,但是c1打点的方式是访问的父类的属性,c2属性时子类的,所以访问的是子类的属性,
他们都是编译时连接,
------解决方案--------------------很不好的程序结构。
main里的i变量,是哪个变量?
如果Test2这个类单独定义的话,那么就无法编译成功。
can not resolve the var: i
------解决方案--------------------1
2
------解决方案--------------------本人认为:c1.i时会判断c1属于什么类,C c1=new D();给出了答案,c1是c的对象,所以c1.i调用C的属性,如果把C c1=new D();改为D c1=new D();结果是2。后面那个也一样,只是c2被强制转换为D而已。
------解决方案--------------------用javap -verbose Test2看看:
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=3, Args_size=1
0: new #2; //class D
3: dup
4: invokespecial #3; //Method D. " <init> ":()V
7: astore_1
8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_1
12: getfield #5; //Field C.i:I ****注意这里****
15: invokevirtual #6; //Method java/io/PrintStream.println:(I)V
18: new #2; //class D
21: dup
22: invokespecial #3; //Method D. " <init> ":()V
25: astore_2
26: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
29: aload_2
30: checkcast #2; //class D
33: getfield #7; //Field D.i:I ****注意这里****
36: invokevirtual #6; //Method java/io/PrintStream.println:(I)V
39: return
------解决方案-------------------- 很不好的程序结构。
main里的i变量,是哪个变量?
如果Test2这个类单独定义的话,那么就无法编译成功。
can not resolve the var: i
/////////////////////////////////////////////
可以的,因为默认不是private的,不过这样确实不好啊
打印的是1,2
c2是一个指向了D类的对象的引用,所以它是2
C++里面允许一个父类的指针指向一个子类的对象,其实就是这个原理,也是多态性的一个体现
------解决方案--------------------public static void main(String[] args) {
C c1=new D();
^^^^ ^^^^
System.out.println(c1.i);
^^^^^
C c2=new D();
^^^^ ^^^^
System.out.println(((D)c2).i);
^^^^^^^^^
}
------解决方案--------------------答案是
1
2
------解决方案--------------------1
2
field不存在多态的问题,是谁的就是谁的