你生成的是B的实体,你可以用getClass()方法看看生成后的c是什么类型的。

解决方案 »

  1.   

    你对多台的了解很片面
    多台:执行期绑定、后期绑定把thinking in java看完在来做作业
      

  2.   

    谢谢 takecare(大厅) 和 programdolt(我普普通通,我是个杀猪的) 的关注可是如果是C++程序,c调用的则是A的方法。在C++中,即使c是B的实例,因为其声明为A,所以调用的时A的方法,为什么一样的代码Java和C++中的不同那?C++中每个类的实例在内存空间中保存的是成员变量,类的方法编译后和全局函数一样。不知道Java中每个类的实例中除了成员变量还有什么东东?小弟很是困惑?
      

  3.   

    其实在你的那一句话中包含了类型转换的一层意思,
    A c = new B();首先声明了一个A的对象变量,然后构造了一个B的对象赋给c实际是一种隐含的类型转换。
    例如:
    首先定义 3 个类:
     class Super {}
     class Sub_One extends Super {}
     class Sub_Two extends Super {} 
    注意:Sub_One 和 Sub_Two 两个类有共同的父类 Super。 然后创建这 3 个类的对象: Super sup = new Super();
    Sub_One sub1 = new Sub_One();
    Sub_Two sub2 = new Sub_Two(); 在程序中的语句            转换            备注           编译/运行结果
    sup = sub1;          子类 —> 父类      编译和运行时都合法
    sup = (Super)sub1;          子类 —> 父类 强制类型转换  编译和运行时都合法
    sub2 = sub1;          子类 —>子类      编译和运行时都不合法
    sub1 = (Sub_One)sub2; 子类 —> 子类 强制类型转换  编译和运行时都不合法
    sub1 = sup;          父类 —> 子类      编译和运行时都不合法
    sub1 = (Sub_One)sup; 父类 —> 子类 强制类型转换 编译时合法 运行时不合法在 JAVA 中,如果把一个子类的对象赋值给其父类的引用,那么在编译时这个引用具有父类的类型,但在运行时却指向子类的对象。
      

  4.   

    Java不是C++,不要做这种类推!
      

  5.   

    to jiangnanyuzi(江南愚子) :嗯,那你能够给我一个合理的解释么?我很是困惑!:((((
      

  6.   

    的确迷惑,看个例子吧。可能变量和方法的待遇不同吧
    class A {
      int i = 1;
      public void print() {
        System.out.println("invoke by A");
      }
    }public class B
        extends A {
      int i = 2;
      public void print() {
        System.out.println("invoke by B");
      }  public static void main(String[] args) {
        A a = new A();
        a.print(); //结果为:invoke by A
        System.out.println(a.i);//结果是1
        B b = new B();
        b.print(); //结果为:invoke by B
        System.out.println(b.i);//结果是2
        A c = new B();
        c.print(); //结果为:invoke by B
        System.out.println(c.i);//结果是1
      }
    }
      

  7.   

    你的B是从A继承来的,那么你的A里面包含的属性和方法B里面一定也会包含,你在生成对象实例C的时候用的是B(),既B的构造方法生成的,那么对象C包含了B的所有属性和方法。但是你的实例C的类型是A,这是A的成员方法print()就被重载了,所以最后输出的是invoke by B
      

  8.   

    to youyue 兄:这里不是多态机制,而只是子类对方法的重载
      

  9.   

    看下面的例子:
    class A {
      int i = 1;
      public void print() {
        System.out.println("invoke by A");
      }
    }public class B
        extends A {
      int ii = 2;
      public void print() {
        System.out.println("invoke by B");
      }  public static void main(String[] args) {
        A a = new A();
        a.print(); //结果为:invoke by A
        System.out.println(a.i);//结果是1
        B b = new B();
        b.print(); //结果为:invoke by B
        System.out.println(b.ii);//结果是2
        A c = new B();
        c.print(); //结果为:invoke by B
        System.out.println(c.ii);//无法编译通过,variable ii 不存在!
    Class cx = c.getClass();
        System.out.println("Class of c = "+cx.getName());//若注释上面两行,得到B
      }
    }java不可以多重继承(无虚函数的概念,类似采用interface中的空方法实现)。
    java中object的函数优先采用construct此object的类的函数
    java中object成员变量使用声明该object的class的成员变量
      

  10.   

    嗯,实践是检验真理的唯一标准!
    谢谢 大家(尤其是 kongyeeku(李别) )的关注,结帖!
      

  11.   

    kongyeeku:
    你把i改了名当然不行。不要说i,就是把print方法换个名字,例如printx,那么c.printx(); 这句也会出错。我们讨论的是重载,拜托。