class Home{
void provideshelter(){
//code
}
void Acessroom(){
//code
}
}
class KangVilla extends Home{
void AutomaticGates(){
//code
}
//now KangVilla have more methods than Home,clearly.
public static void main(String[] args){
Home H = new KangVilla();
KangVilla k = (KangVilla) H;// i am having problem with these statements
}
}
问题我已经读过在编译时编译器将仅检查引用变量而不是实际对象。所以当我说Home H
时它意味着编译器想到了 H 不是KangVilla
这是原始的。它只关心可以通过类型H
的引用Home
访问的方法,这些 2 在这种情况下,ok。但它允许下一个语句
KangVilla k = (KangVilla) H;
现在这是一个简单的逻辑,k
可以访问比H
更多的方法,因为它是派生类的类型。所以为什么编译器不会因为H
是{转换为k
然后(在此次转化中不会丢失' H')可以通过k
访问更多方法(Home' s + KangVilla本地)可以通过H
访问吗?
那么如何在没有看到实际对象且只看到引用变量的情况下对编译器进行评估
答案 0 :(得分:1)
编译器没有抱怨,因为他无法在设计时期间评估该语句是否非法。这取决于h
的实际类型:
如果您使用这样的东西,它将在运行时工作:
Home h = new KangVanilla(); //this is legal
... //other code
KangVilla k = (KangVilla) h; //so this IS legal.
k.AutomaticGates();
但这会抛出一个Cast-Exception:
Home h = new Home(); //this is legal
KangVilla k = (KangVilla) h; //but this isn't.
k.Autom aticGates();
真正的类型差异我在谈论:
Home h = new Home();
System.out.println(h instanceof Home); //true;
System.out.println(h instanceof KangVanilla); //false;
Home h = new KangVanilla(); //this is a REAL KangVanilla, Casted up to Home.
System.out.println(h instanceof Home); //true;
System.out.println(h instanceof KangVanilla); //true - so THIS can be casted DOWN to a KangVanilla;