2016-01-19 49 views
0

我沿着代码行提到的意见,我想了解即如下:ClassCastException异常铸造一个基类对象扩展基类的类时,

  1. 我didnt't理解这行代码: Xyz obj3=(Xyz) obj1;

  2. Abc不能转换到Xyz类型。编译,但是在执行过程中返回异常:Xyz obj2=(Xyz)new Abc();

    class Abc 
    { 
    
        Abc() 
    
        { 
    
        System.out.println(" Hello "); 
    
        } 
    
        void show() 
        { 
         System.out.println("Conco constructor w/ Super Class"); 
        } 
    
    } 
    
    class Xyz extends Abc 
    
    { 
    
        Xyz() 
    
        { 
         System.out.println(" Hi "); 
        } 
    
        void display() 
        { 
         System.out.println("ConsNew3 constructor w/ Extends Class Conco"); 
        } 
    
        public static void main(String arg[]) 
        { 
         Xyz obj=new Xyz(); 
    
         Abc obj1=new Xyz(); 
         obj1.show(); 
    
         Xyz obj3=(Xyz) obj1; // I didnt't understand this line of code 
    
    
         /*Xyz obj2=(Xyz)new Abc(); Abc cannot be cast to Xyz type . Compiled , but returns exception during execution */ 
    
    
        } 
    } 
    
+3

2 /狗是动物,但动物并不总是狗 –

+1

这似乎并不约为隐性或显性的构造函数。它关于[多态性](https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29)。 – khelwood

+0

@RC。逻辑的解释,可以帮助超过变形的方法。希望,你不介意通知它? – 1ambharath

回答

1

Xyz obj3=(Xyz) obj1;这行工作,因为XyzAbc

Xyz obj2=(Xyz)new Abc();此行不起作用,因为不是所有的Abc s为Xyz小号

正如注释提到它可以更有意义,事物命名这种方式。

美国广播公司==动物

的Xyz ==狗

Dog obj3 = (Dog) obj1;

obj1虽然它正在举行一个更通用的Animal对象先前已被实例化为Dog。它仍然是Dog的一个实例,因此它可以转换回Dog

Dog obj2 = (Dog) new Animal();

Animal s为不一定Dog秒。

为了避免这样的问题,您可以使用instanceof运算符。这测试一个通用Object是否是另一个实例,通常是更具体的Object。

您可以如下使用它。

Object myGenericDog = new Dog(); 
Animal myAnimal = new Animal(); 

if(myGenericDog instanceof Animal){ 
    myAnimal = (Animal) myGenericDog; 
} 

以供将来参考,在真实和示例代码情况下,它是遥远的开发者编写的代码,谁最终可能维护代码使用描述类名称的任何未来发展更为有利。注:XyzAbc不是描述性。它们带来不必要的复杂性你可以通过选择名词来描述你课程的责任,从而改善你自己的代码和例子。

+0

这是非常有帮助的。感谢你,尊敬和问候。 – 1ambharath

+0

如果片刻,我将变质部分放在一边。 “并非所有的动物都是狗,好吧。”那么,这是否意味着并非动物类型的所有方法都与那些类型的狗兼容? – 1ambharath

+0

我投了票,先生。 – 1ambharath

2

一般来说,人类在抽象符号方面不是很好,尽管程序需要这样做。

编程中的初学者(更正确的说是任何人)不应该使用像Abc和Xyz这样的抽象名称,这甚至会让高级程序员感到困惑。

为什么不把ABC重命名为Animal,而Xyz To Dog就是这样。

然后,你必须:

Dog obj3=(Dog) obj1; // works because Dog is an Animal. 
Dog obj2=(Dog) new Animal(); // does not compile because not all Animals are Dogs 
+0

谢谢。我也同意你的看法。希望,我可以有一个以上的答案被接受。 – 1ambharath