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

很简单的题目,我想不明白
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不存在多态的问题,是谁的就是谁的