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);
}}
运行结果是什么?为什么?谢谢

解决方案 »

  1.   

    输出结果是c1=1,c2=2,
    因为c1、c2是new的子类的对象,他们同时就有了父类和子类的方法和属性,但是c1打点的方式是访问的父类的属性,c2属性时子类的,所以访问的是子类的属性,
    他们都是编译时连接,
      

  2.   

    很不好的程序结构。
    main里的i变量,是哪个变量?如果Test2这个类单独定义的话,那么就无法编译成功。
    can not resolve the var: i
      

  3.   

    本人认为:c1.i时会判断c1属于什么类,C c1=new D();给出了答案,c1是c的对象,所以c1.i调用C的属性,如果把C c1=new D();改为D c1=new D();结果是2。后面那个也一样,只是c2被强制转换为D而已。
      

  4.   

    用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
      

  5.   


    很不好的程序结构。
    main里的i变量,是哪个变量?如果Test2这个类单独定义的话,那么就无法编译成功。
    can not resolve the var: i  
    /////////////////////////////////////////////
    可以的,因为默认不是private的,不过这样确实不好啊
    打印的是1,2
    c2是一个指向了D类的对象的引用,所以它是2
    C++里面允许一个父类的指针指向一个子类的对象,其实就是这个原理,也是多态性的一个体现
      

  6.   

    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);
                        ^^^^^^^^^ 
    }
      

  7.   

    1
    2field不存在多态的问题,是谁的就是谁的