class A
{
    public String vara="aaa";
    void print(){
        System.out.println(vara);
    }
}class B extends A
{
    public String vara="bbb";
    void print(){
        System.out.println(vara);
    }
}public class Main {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        A ca=new A();
        B cb=new B();
        A cab=new B();        System.out.println("ca:"+ca.vara);
        ca.print();
        System.out.println("----------------------");
        System.out.println("cb:"+cb.vara);
        cb.print();
        System.out.println("----------------------");
        System.out.println("cab:"+cab.vara);
        cab.print();
    }}结果是
ca:aaa
aaa
----------------------
cb:bbb
bbb
----------------------
cab:aaa
bbb那么第三个是为什么是这样子呢?
具体实现过程原理是怎么样的啊?有点糊涂了

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【liucs1985】截止到2008-07-16 21:01:49的历史汇总数据(不包括此帖):
    发帖的总数量:5                        发帖的总分数:20                       每贴平均分数:4                        
    回帖的总数量:5                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:5                        结贴的总分数:20                       
    无满意结贴数:4                        无满意结贴分:80                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:80.00 %               无满意结分率:400.00%                  
    敬礼!
      

  2.   

    A cab=new B(); 是一个向上转型的语句 如果有子类覆盖了父类的方法  那么就掉用子类的方法  否则调用父类的方法
      

  3.   

    偶的理解是。A cab; // cab是父类对象的引用(变量)
    cab = new B(); // 父类的引用(变量)cab当然可以指向其子类对象B
    cab.print(); // 动态绑定(对方法有效),在运行时决定 有引用对象的类型(这里即B),而不是引用对象的变量(这里即A)的类型来决定调用哪个方法。
    cab.vara; // 值域貌似只由引用变量的类型(这里即A)来决定
      

  4.   

    一个很重要的问题是多态是对于方法而言的,方法会在运行时动态绑定,但对于数据成员(java中叫field)是编译的时候静态绑定的.
    A cab=new B(); 
    System.out.println("cab:"+cab.vara);
            cab.print(); 
    cab.vara直接访问的父类的成员vara,print()是方法,动态绑定,实际是调用的子类的方法print,它访问的是子类的vara
      

  5.   

    cab是一个指针的话,那么它指向的是哪个实例,就是B的实例吗?cb=(B)cabSystem.out.println("----------------------"); 
    System.out.println("cab:"+cab.vara); 
    cab.print(); cb指向的cab的实例吗?那么
    ca=(A)cab
    ca指向的也是cab的实例
    为什么结果会不同呢cb=(B)cab
    具体的过程是怎么样的?
    比如cb中vara变成了“bbb”或者“aaa”
    print方法调用的vara是哪里的,怎么调用的之类
      

  6.   

    class A {    public String vara = "aaa";    void print() {
            System.out.println("this is A's print method");
            System.out.println(vara);
        }
    }class B extends A {    public String vara = "bbb";    void print() {
            System.out.println("this is B's print method");
            System.out.println(vara);
            System.out.println(super.vara);
        }
    }public class ClassMain {    public static void main(String[] args) {
            // TODO code application logic here
            A cab = new B();
            System.out.println("cab:" + cab.vara);
            cab.print();
        }
    } 这个例子可能能说的更清楚些.
    子类重写的方法中如果需要访问父类的成员,用super.vara 来访问.
      

  7.   

    print方法是哪个类的,它访问到的成员就是哪个类的.
    你可以在父类的print方法和子类的方法里都加一些说明自己是哪个类的语句,这就明白调用的是哪个类的方法了.
      

  8.   

    cb=(B)cab System.out.println("----------------------"); 
    System.out.println("cb:"+cb.vara); 
    cb.print(); 不好意思,更正上面的代码
      

  9.   


    ca=(B)cabca.print()方法是动态绑定还是静态绑定的?
      

  10.   

    在这里学习使我对继承有个更加深刻的了解。谢谢楼主,赞成ZangXT 说举的例子