当子类的对象被分配给超类的变量时,为什么只有那些成员 是可访问的,由超类
定义class A {
int i=10;
void adsip() {
System.out.println(i);
}
}
class B extends A {
int j=20;
void bdsip() {
System.out.println(i+j);
}
}
class inherit4 {
public static void main(String[] x) {
A a=new A();
B b=new B();
System.out.println("b.i="+b.i+"b.j="+b.j);
b.adsip();
b.bdsip();
a=b;
System.out.println("a.i="+a.i);
a.adsip();
}
}
上面的代码工作正常 但是在添加a.j和a.bdisp()之后;如果我知道& b在上面的代码中表示 对A类和A类物体的记忆分配的参考B那么为什么代码无法访问a.j和a.bdsip();在上面的代码中。
答案 0 :(得分:1)
ClassCastException - 抛出此异常表示代码已尝试将对象强制转换为不是实例的子类。
例如,以下代码生成ClassCastException:
Object x = new Integer(0);
System.out.println((String)x);
答案 1 :(得分:1)
为什么只有那些由超类
定义的成员才可访问
因为在运行时,超类引用可能指向子类层次结构中任何类的超类实例或实例。
超类有方法m1,但是子类有方法m1和m2。您想使用超类的引用访问m2。但是,如果在运行时引用指向超类的实例(没有m2),该怎么办?
所以最终的结果是 - 在运行时,唯一保证可以使用超类引用访问的成员是超类中定义的成员。
答案 2 :(得分:1)
在继承中,子可以访问父数据但反过来是不可能的。父无法访问子数据。所以这里是A类的对象,a不能访问B类的方法或数据。