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类都有的方法行吗?这有是为什么?

解决方案 »

  1.   

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

  2.   

    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()是编译都不会通过。