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

有关继承接口抽象类,调用对象方法动态邦定的问题.
abstract   class   A{
     
        private   int   a;
        public   A(inta){
   
              this.a   =   a;
   
        }
        public   void   getC(){
                return   a;
        }
       
        public   void   ddd(){     }
        public   abstract   void   ccc();
   
}
class   B   extends   A{
       
        private   int   d;
        public   B(int   a,   int   d){
             
            super(a);
            this.d   =   d;
        }
        public   void   ddd(){     }//重写此方法;
     
        public   int   getD(){
            return   d;
        }  
        public   void   ccc(){     }//实现抽象发放;

}

如果我在main方法里用.A   c   =   new   B();

                                                System.out.println(c.getD());行不行.为什么?

以上是抽象类,如果我实现的是一个接口,那这样调用方法行不行,为什么.

如果是一般的类,我这样调用行吗?因为c不是B类型的而是A类型的,可是A类里面又没有这个方法,虽然我引用了B类,但是不知道能不能调用.请大家指教.
如果在一般类里面,我引用上面的main方法调用一个A类和B类都有的方法行吗?这有是为什么?

------解决方案--------------------
如果我在main方法里用.A c = new B();

System.out.println(c.getD());行不行.为什么?
----------------------------------
不行, 现在c是A类型的没有getD()这个方法。
A c = new B(); 只有在B继承或者实现了A的情况下才能这样实例化


------解决方案--------------------
A c = new B();
System.out.println(c.getD());
行不行.为什么?
----------------------------------
当然不行,因为c是A类型的,而A类中没有getD()这个方法。
但是((B) c).getD()就可以。

如果是接口或者一般类,道理是一样的。这是因为编译器只知道c是A类型的。

对于ddd()方法,c.ddd()是可以的,但由于c的实际类型是B,所以在heap中对应的方法实现是B的方法,所以真正调用的时候会执行B的ddd()而不是A的ddd(),这才是动态绑定。而getD()是编译都不会通过。