//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");
}
}
为什么code-1与code-2不同。 Code-1正在成功执行,但是Code-2在第2行给出了编译错误。 虽然,在两段代码中做同样的事情。 我知道它在编译期间无法在超类中找到该方法。但我怀疑的是,如果已经在第1行显式转换它,那么为什么它会抛出编译错误。如果是这样,那么它也应该为代码1抛出错误。
答案 0 :(得分:3)
您收到编译错误,因为此行(emp11).displayEmp2();
是无效的Java语句。你必须在csating括号内给出一个Type(类名)
此外,必须在进行方法调用的同一语句中进行向下转换。 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
答案 1 :(得分:1)
将emp11
投射到Emp2
没有任何意义,如果以后将其分配回emp11
,其类型为Emp1
。类型为Emp1
的变量只允许调用类Emp1
的方法。
为了使第二个代码段的行为与第一个一样,您应该将转换结果分配给Emp2
类型的变量:
Emp1 emp11 = new Emp2();
Emp2 emp2 = (Emp2) emp11;
emp2.displayEmp2();