运行时多态和向上转换,向下转换

时间:2014-06-11 06:36:31

标签: java

 class AA {  
      void run()
          {
             System.out.print("In AA");
          }  
     }  
 class B extends AA{
          void run()
         {
             System.out.print("In B");
         }  
     public static void main(String z[])
        {  

      //upcasting 
      AA a= new B();
      a.run();
    }  
} 

Upcasting在这里工作正常,但现在我试图像这样调用Parent类方法..

B b=new AA();

它会产生编译时错误,因此强制转换它。

 B b=(B) new AA();

但是,我不确定为什么它没有按照我的预期工作。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

什么

B extends AA

是的,BAA,但AA不是B。让我们举个例子:

Employee extends Person

这意味着EmployeePerson,但Person不一定是Employee

当你这样做的时候 字符串文字未通过双引号正确关闭     AA a =新B();

a的引用类型为AA,但对象类型为B。这种声明只允许调用AA中声明的方法。

否则

B b = new AA();

因为AA不是B而无法工作,如上例所示。

答案 1 :(得分:0)

B类是AA的一个实例;但是,AA类不是B

的实例

当您声明B时,Javac编译器无法知道存在扩展AA的类new AA();

如果您在此理论背后提出问题,假设您还有另一个派生AA的类,例如:

public class C extends AA {
    @Override void run() { System.out.println("i do something different");}
}

现在,当您致电new AA()时,您如何知道AA可以投放到哪个?你打电话给run()时叫什么? run属于B吗?还是C

如果要以多态方式工作,则需要实例化BC类。但对AA的每个孩子来说,这不会浪费太多空间吗?

答案 2 :(得分:0)

我不知道你在Java中的多态性有多远,但这是一个你应该真正理解的概念,因为它是OOP的基础。

所以,使用一些ASCII类图:

AA <- B

B是AA的子类。一种特殊类型的AA,如果你想换句话说。所以你可以使用AA ref = new B();

另一方面,AA不是B的实例。当参考类型为B时,不能使用AA的专业化。

让我们看一个例子:

Animal <- Cat
       <- Dog
       <- TyrannosaurusRex 

我们都同意Cat,Dog和TyrannosaurusRex都是动物,因此您可以使用Animal a类型指向Cat,Dog或TyrannosaurusRex。另一方面,TyrannosaurusRex rex不能任何动物,因此TyrannosaurusRex rex = new Animal()应该给出错误是正常的。

答案 3 :(得分:0)

首先,您需要研究参考变量

Object str =new Object() // this is Correct.
String newString = (String) str // this is not allowed because str object does not have the reference of String 

但是你仍在使用String,但它仍无法正常工作。

Actually str is reference is Object. 

清除。

现在问题解决了

B has an reference of AA but 
AA  class has not reference of class B