如何将基类型对象分配给父类型引用?

时间:2014-06-14 13:08:20

标签: java reference

 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访问吗?

那么如何在没有看到实际对象且只看到引用变量的情况下对编译器进行评估

1 个答案:

答案 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;