JAVA中的接口和类

时间:2015-10-18 18:53:12

标签: java uml class-diagram

让我们以类图为例

enter image description here

我在java中创建了类似的类,如下所示

public class B {

}

public interface C {

}

public class A extends B implements C {

}

public class D {
    C c = new A();
    C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ?
    C c2 = (C) new B(); // Works fine. This makes me confuse ... What does this actually mean ?
}

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:1)

C c1 = new B()

您永远不能将B类实例化为接口C,因为它没有实现接口C.

C c2 = (C) new B()

在第二种情况下,您明确地将B的实例强制转换为C类。编译器允许这样做,但是您将获得运行时异常。

答案 1 :(得分:1)

为什么C c2 = (C) new B();无法编译:请参阅Ankur Shanbhag的回答。

C c2 = (C) new B();可以很好地编译,但由于c2B对象,因此无法转换为C,这将在运行时抛出异常。

我做了一个例子:

public class D {
    public static void main(String[] args) {
        C c2 = (C) new B();           
        System.out.println(c2);
    }
} 

并收到例外:

Exception in thread "main" java.lang.ClassCastException: casting.B cannot be cast to C

答案 2 :(得分:0)

C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ?

您只能通过超类引用来引用派生类。在您的情况下,C不是B的超类。因此错误

C c2 = (C) new B(); // This makes me confuse ... What does this actually mean ?

编译器不允许您执行上述转换。要从一种类型转换为另一种类型,这两个类必须位于同一个对象层次结构中。

答案 3 :(得分:0)

延伸意味着“是一种”。

A是一种B,因此它具有B的所有功能。

但是,B 不是一种A,因此它不一定具有A的所有功能,包括实施{ {1}}。这就是你输入类型不匹配的原因。

但在这种情况下:

interface C

Casting 告诉编译器“不要检查这个,因为我知道我在做什么。”所以它可以编译。

但是如果在运行时,实际强制转换的对象无法输入为C c2 = (C) new B() ,那么您将获得C。在您的情况下,您将ClassCastException投射到B,而C不是B,而是C A }}。所以你会得到例外。