多态与显式铸造对象

时间:2016-07-10 13:11:02

标签: java inheritance casting polymorphism

    //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抛出错误。

2 个答案:

答案 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();