继承Java超类和类型转换
我有两个Java类继承Java超类和类型转换,java,oop,subclass,Java,Oop,Subclass,我有两个Java类 Class A { void method1(){} } Class B extends A { void method2(){} } 当我运行以下程序时,它工作正常: Class C { public static void main(String [] args){ A a1 = new A(); A a2 = new B(); B b1 = new B(); ((B)a2).method2(); } } 但是为什么下面的
Class A { void method1(){} }
Class B extends A { void method2(){} }
当我运行以下程序时,它工作正常:
Class C {
public static void main(String [] args){
A a1 = new A();
A a2 = new B();
B b1 = new B();
((B)a2).method2();
}
}
但是为什么下面的方法不起作用呢
Class C {
public static void main(String [] args){
A a1 = new A();
A a2 = new B();
B b1 = new B();
(B)a2.method2();
}
}
谢谢您必须在施法后调用该方法。a2周围需要括号,即
((B)a2).method2();
正如Kabir所说,在从另一个对象调用方法之前,需要先强制转换该对象 这是因为Java将您的第二条语句读取为:
(B)(a2.method2();)
因此java尝试在A对象a2中使用方法2,但它不能,因为该对象中没有method2()
但是,当您键入cast时(通过将(B)放在括号中a2之前),其内容如下:
(将a2转换为B.method2()代码>
它运行良好,因为它事先将a2转换为B,包括方法2
在与数学概念的简单比较中,它就像计算值的操作顺序。你不会说5+5*2=20
,你会说5+5*2=15
,因为它首先计算5*2
,然后添加5
,但为什么呢?因为这两条语句都将其强制转换为b,所以您尝试强制转换的是返回值。