Java 多态性与对象的显式转换

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不同于代码2。 代码1正在成功执行,但代码2在第2行给出编译错误。 不过,在这两段代码中执行相同的操作。
我知道它在编译期间无法在超类中找到该方法,但我的疑问是,如果已经在第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