有关继承接口抽象类,调用对象方法动态邦定的问题.
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()是编译都不会通过。