Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中的接口和类_Java_Uml_Class Diagram - Fatal编程技术网

JAVA中的接口和类

JAVA中的接口和类,java,uml,class-diagram,Java,Uml,Class Diagram,让我们以下面的类图为例 我用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

让我们以下面的类图为例

我用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 ?
}
有人能解释一下吗

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 ?
编译器不允许您执行上述强制转换。要从一种类型转换为另一种类型,两个类必须位于同一对象层次结构中

C c1 = new B()
您永远不能将类B实例化为接口C,因为它没有实现接口C

C c2 = (C) new B()
在第二种情况下,您显式地将B实例强制转换为C类型。编译器允许这样做,但您将得到一个运行时异常。

为什么
C c2=(C)新B()未编译:请参阅Ankur Shanbhag的答案

c2=(C)新的B()
可以很好地编译,但由于
c2
B
对象,因此无法转换为
C
,因此在运行时会引发异常

我举了一个例子:

public class D {
    public static void main(String[] args) {
        C c2 = (C) new B();           
        System.out.println(c2);
    }
} 
并收到一个例外:

线程“main”java.lang.ClassCastException中的异常:强制转换.B不能强制转换为C
扩展意味着“是一种”

A
B
的一种,因此它具有
B
的所有特性

然而,
B
不是
a
的一种,因此它不一定具有
a
的所有特性,包括实现
接口C
。这就是为什么会出现类型不匹配

但在这种情况下:

C c2 = (C) new B()
Casting告诉编译器“不要检查这个,因为我知道我在做什么。”所以它可能会编译


但是,如果在运行时,您实际强制转换的对象不能被类型化为
C
,您将得到
ClassCastException
。在您的例子中,您正在将a
B
转换为a
C
,而a
B
与其说是一种
a
,不如说是一种
C
。所以你会得到例外。

为什么我的问题被否决?@Junaid不加评论地忽略那些否决票。