在将一个超类型对象向下转换为子类型后,当我调用超类型对象上的任何方法时,它们实际上并未被调用

时间:2018-01-24 20:22:29

标签: java downcast

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

此代码不提供任何编译时或运行时错误。但输出是空白的。在控制台上没有打印。我期待以下输出:

amethod
in A

我做错了什么?请帮忙。提前致谢

1 个答案:

答案 0 :(得分:2)

  

我做错了什么?

A a1 = new A();
if(a1 instanceof B){
    B b1 = (B) a1;
    b1.amethod();
    b1.overridenmethod();
}

不会执行正文,因为a1会导致B的实例。 instanceof表达式始终为false。

如果您使用new A(...)创建实例,则结果可以用作AA的任何超类型或界面(在您的情况下只有Object { {1}})。

BA的子类型,因此您可以将B视为A(将其重写的方法替换为A个),但不是相反。

在您存储A实例的引用的位置并不重要 - 该实例不会对A实例进行任何更改。