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();
但是,我不确定为什么它没有按照我的预期工作。有什么想法吗?
答案 0 :(得分:2)
什么
B extends AA
是的,B
是AA
,但AA
不是B
。让我们举个例子:
Employee extends Person
这意味着Employee
是Person
,但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
?
如果要以多态方式工作,则需要实例化B
和C
类。但对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