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();
}