我有3个班级A,B和c如下
A.java
class A
{
protected A(){
System.out.println("A");
}
void show()
{
System.out.println("showA");
}
}
B.java
class B extends A
{
B(){
System.out.println("B");
}
void show()
{
System.out.println("showB");
}
}
C.java
class C extends B
{
C(){
System.out.println("C");
}
void show()
{
System.out.println("showC");
}
public static void main(String... args)
{
A a= (B)new C();
a.show();
}
}
执行时给出输出
D:\java\rmi\Hello>javac C.java
D:\java\rmi\Hello>java C
A
B
C
showC
我知道一个超类不能被转换为子类。但是在输出中为什么在超类B被强制转换时执行C类方法(show)?
A a= (B)new C();
如果这是正确的那么它是什么才能被转移到B?
我的意思是这里新的C()将调用C构造函数,因此调用相应的输出
new C().show();
和(B)new C().show();
之间有什么区别?
答案 0 :(得分:1)
投射对象不会改变其类型。
(B) new C();
仍将创建C
类型的对象,无论你将它投射到什么。但是,如果你只创建一个B
,它当然只会是一个B
,这就是为什么在你执行时没有调用C
的构造函数的原因
(C) new B();
答案 1 :(得分:1)
错误“B不能在C.main转换为C”意味着超类B由C进行转换,这是一个子类。(只需反复阅读它,你就会理解它。)
您可以使用上部元素转换层次结构中的较低元素,但不能反之亦然。
希望你明白了:)
答案 2 :(得分:0)
B类不扩展C,所以它不知道它并且不能被转换为C.使用java,你可以向下投射而不是向上投射。
确定:强>
A a= (B)new C();
- > C继承自B,因此可以进行强制转换
不行
A a= (C)new B();
- > B不从C继承,因此无法转换为
编辑: 请考虑编辑您的问题,因为大多数用户倾向于首先更正错误。 (删除错误并将其分解为原始问题)
“new C()。show();和(B)new C()。show();”之间有什么区别?“ 这称为“多态”。两个调用之间没有区别,因为java总是执行层次结构最低级别的方法。
例如:
class Bird{
public void fly(){
System.out.println("I am flying");
}}
class Duck extends Bird{
public void fly(){
System.out.println("I can not fly");
}}
class Test{
public static void main(String[] args){
Bird[] birds = {new Bird(), new Duck()};
for (Bird b: birds){
b.fly();
}
}
这将输出:
I am flying
I cannot fly
答案 3 :(得分:0)
创建类的对象时,首先创建其超类对象。 所以,当你说 A =(B)新的C(); 在创建C的对象时,首先创建其超类对象。因此C的对象可以转换为B. 但是在后一种情况下,在创建B的对象时,它是不可能的。
永远记住,子类对象可以被转换为超类,因为超类对象不能被转换为它的子类,这是由你在第二种情况下完成的,因此它会给你编译错误。