【问题标题】:Polymorphism and Explicit casting of object对象的多态性和显式转换
【发布时间】:2016-07-10 13:11:01
【问题描述】:
    //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 不同。 代码 1 执行成功,但代码 2 在第 2 行出现编译错误。 虽然,在两段代码中做同样的事情。 我知道它在编译期间将无法在超类中找到该方法。但我怀疑是否已经在第 1 行显式转换它,那么为什么它会引发编译错误。如果这样做,那么它也应该为 code-1 抛出错误。

【问题讨论】:

标签: java inheritance casting polymorphism


【解决方案1】:

您收到编译错误,因为这行 (emp11).displayEmp2(); 是无效的 Java 语句。你必须在括号内给出一个类型(类名)

此外,向下转换必须在执行方法调用的同一语句中进行。 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

【讨论】:

  • 但它是使用子类实例化的,然后在下一步使用显式转换我可以做到这一点吗?
【解决方案2】:

如果稍后将emp11 分配回emp11(其类型为Emp1),则将emp11 转换为Emp2 没有任何意义。类型为Emp1 的变量只允许调用Emp1 类的方法。

为了使第二个 sn-p 表现得像第一个,您应该将转换结果分配给 Emp2 类型的变量:

Emp1 emp11 =  new Emp2(); 
Emp2 emp2 = (Emp2) emp11;
emp2.displayEmp2();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多