Java 将超类型对象向下转换为子类型后,当我调用超类型对象上的任何方法时,它们实际上不会被调用
此代码不提供任何编译时或运行时错误。但输出是空白的。控制台上没有打印任何内容。我期待以下输出:Java 将超类型对象向下转换为子类型后,当我调用超类型对象上的任何方法时,它们实际上不会被调用,java,downcast,Java,Downcast,此代码不提供任何编译时或运行时错误。但输出是空白的。控制台上没有打印任何内容。我期待以下输出: class A{ void amethod(){ System.out.println("amethod"); } void overridenmethod(){ System.out.println("in A"); } } class B extends A{
class A{
void amethod(){
System.out.println("amethod");
}
void overridenmethod(){
System.out.println("in A");
}
}
class B extends A{
void bmethod(){
System.out.println("bmethod");
}
void overridenmethod(){
System.out.println("in B");
}
}
class Test{
public static void main(String args[]){
A a1 = new A();
if(a1 instanceof B){
B b1 = (B) a1;
b1.amethod();
b1.overridenmethod();
}
}
}
我做错了什么?请帮忙。提前谢谢
我做错了什么
不会执行正文,因为a1
不是B
的实例。instanceof
表达式始终为false
如果使用newa(…)
创建实例,则结果可以用作A
或A
的任何超类型或接口(在您的情况下,这只是对象
)
B
是a
的一个子类型,因此您可以将任何B
视为a
(其重写方法替换a
方法),但不是相反
无论您将
a
实例的引用存储在何处,这都不会改变该实例是a
a1
不是B
的实例。请尝试a1=newb()代码>我打算做的是向下转换一个超类型,然后调用它的方法。我该怎么做?我需要了解在向下转换一个超类型后呈现的功能。@user7812612按照Oleksandr所说的做,您可以向下转换a1
到b1
。向下转换用于将声明的类型与实际类型相匹配。它不会更改对象的实际类型,因此为了向下转换到B
,对象必须已经是B
@Oleksandr语句是从B类型对象向上转换到类型对象。我想向下而不是向上
amethod
in A
A a1 = new A();
if(a1 instanceof B){
B b1 = (B) a1;
b1.amethod();
b1.overridenmethod();
}