Java 当铸造两个类时,会铸造什么?它是物体吗?
我有3门课A、B和c,如下所示 A.javaJava 当铸造两个类时,会铸造什么?它是物体吗?,java,casting,Java,Casting,我有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()
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构造函数,从而调用相应的输出,但是
newc().show()之间的区别是什么代码>和(B)新的C().show()代码>此处要强制转换什么?强制转换对象不会更改其类型
(B) new C();
仍将创建类型为C
的对象,无论您将其强制转换为什么。但是如果你只创建了一个B
,它当然只会是一个B
,这就是为什么在执行时不会调用C
的构造函数的原因
(C) new B();
类B不扩展C,因此它不了解C,不能转换为C。使用java,可以向下转换,但不能向上转换
确定:
A a= (B)new C();
->C继承自B,因此可以进行强制转换
不正常
A a= (C)new B();
->B不是从C继承的,因此不能将其强制转换为C
另见:
编辑:
请考虑编辑您的问题,因为大多数用户倾向于首先纠正错误。(删除错误并将其分解为原始问题)
“新的C().show()和(B)新的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
创建类的对象时,首先创建其超类对象。
所以当你说
A=(B)新的C();
在创建C的对象时,首先创建它的超类对象。所以C的对象可以被铸造成B。
但在后一种情况下,在创建B的对象时,这是不可能的
请始终记住,子类对象可以强制转换为超类,而超类对象不能强制转换为其子类,这是在第二种情况下由您完成的,因此它会给您带来编译错误。错误“B不能在C.main强制转换为C”意味着超类B是由作为子类的C强制转换的。(只要再读一遍,你就会明白的。)
您可以在层次结构中使用较低的元素和较高的元素,但不能使用相反的元素。
希望您能理解:)好的,但我的问题是关于show方法调用,而不是相应的构造函数。这两个调用是新的C().show();(B)新的C().show()完全相同,没有任何区别?它实际上不是关于show()
,因为它从未被调用过。异常发生在调用show
上方的行中。但是,((B)new C()).show()和new C().show()
确实是同一种方法。感谢您的解释,但我的问题是关于所有类中都存在的对show()的调用,而C的show是在A=(B)new C()的情况下执行的;。因此,新的C()和show()之间绝对没有区别;和(B)新的C()。show()?这两者之间的区别是,在第一种情况下,新的C()可以被赋予类A、B或C的任何引用,但在第二种情况下(B),新的C()可以被赋予类A或B的引用,但不能赋予C。感谢您的解释,但我的问题是关于所有类中都存在的对show()的调用,C的show是在A=(B)new C()的情况下执行的;。因此,新的C()和show()之间绝对没有区别;和(B)新的C()。show()?java总是采用最低级别的方法,在您的例子中是类“C”,即使是强制转换的。是的,C(),show();和(B)新的C().show();执行相同的方法。