Java 多态性与对象的显式转换
为什么代码1不同于代码2。 代码1正在成功执行,但代码2在第2行给出编译错误。 不过,在这两段代码中执行相同的操作。Java 多态性与对象的显式转换,java,inheritance,casting,polymorphism,Java,Inheritance,Casting,Polymorphism,为什么代码1不同于代码2。 代码1正在成功执行,但代码2在第2行给出编译错误。 不过,在这两段代码中执行相同的操作。 我知道它在编译期间无法在超类中找到该方法,但我的疑问是,如果已经在第1行显式地转换了它,那么为什么会抛出编译错误。如果这样做,那么它也应该为code-1抛出错误。将emp11转换为Emp2没有意义,如果稍后您将其重新分配回Emp1,其类型为Emp1。类型为Emp1的变量只允许调用类Emp1的方法 为了使第二个代码段的行为与第一个相同,您应该将强制转换的结果分配给Emp2类型的变量
我知道它在编译期间无法在超类中找到该方法,但我的疑问是,如果已经在第1行显式地转换了它,那么为什么会抛出编译错误。如果这样做,那么它也应该为code-1抛出错误。将
emp11
转换为Emp2
没有意义,如果稍后您将其重新分配回Emp1
,其类型为Emp1
。类型为Emp1
的变量只允许调用类Emp1
的方法
为了使第二个代码段的行为与第一个相同,您应该将强制转换的结果分配给Emp2
类型的变量:
//code-1
Emp1 emp11 = new Emp2();
((Emp2) emp11).displayEmp2();
//code-2
Emp1 emp11 = new Emp2();
emp11 = (Emp2) emp11; //line-1
(emp11).displayEmp2(); //line-2
class Emp1 {
public void displayEmp1(){
System.out.println("displayEmp1");
}
}
class Emp2 extends Emp1 {
public void displayEmp2(){
System.out.println("displayEmp2");
}
}
您得到一个编译错误,因为这一行
(emp11).displayEmp2()代码>是无效的Java语句。您必须在csating括号内指定一个类型(类名)
此外,向下广播必须在执行方法调用的同一语句中进行emp11
定义为Emp1
类型。每次您希望从子类调用方法时,都必须显式地强制转换它
Emp1 emp11 = new Emp2();
Emp2 emp2 = (Emp2) emp11;
emp2.displayEmp2();
Emp1 emp11
表示emp11
是对Emp1
的引用。再多的强制转换也不会改变这一点。他们做的不是同一件事。但它是使用子类实例化的,只有在下一步使用显式强制转换时,我才能做到这一点,对吗?
Emp1 emp11 = new Emp2();
emp11 = (Emp2) emp11;
emp11.displayEmp2(); // emp11 returned to type Emp1
((Emp2)emp11).displayEmp2(); // every call to emp2 method has to be explicitly cast