我在K& B的SCJP书中从章节对象方向理解问题9中遇到了问题。
问题:
public class Redwood extends Tree {
public static void main (String [] args) {
new Redwood ( ) . go ( ) ;
}
void go ( ) {
go2 (new Tree ( ) , new Redwood ( ) ) ;
go2 ( (Redwood) new Tree ( ) , new Redwood ( ]
}
void go2 (Tree tl, Redwood rl) {
Redwood r2 = (Redwood) tl;
Tree t2 = (Tree)rl;
}
}
class Tree { }
选项:
What is the result? (Choose all that apply.)
A. An exception is thrown at runtime
B. The code compiles and runs with no output
C. Compilation fails with an error at line 8
D. Compilation fails with an error at line 9
E. Compilation fails with an error at line 12
F. Compilation fails with an error at line 13
书中给出的答案是A,因为Tree不能向Redwood倾斜。我只是有理解这个概念的问题。
答案 0 :(得分:3)
>
class Tree{
// super class
}
public class Redwood extends Tree{
//child class
public static void main (String [] args) {
new Redwood ( ) . go ( ) ; // Calling method go()
}
void go ( ) {
go2 (new Tree ( ) , new Redwood ( ) ) ;
go2 ( (Redwood) new Tree ( ) , new Redwood ( )); // Problem is Here
/*
(Redwood)new Tree(),------>by this line Tree IS-A Redwood Which wrong
According to Question
Redwood IS-A Tree So relationship is
(Tree) new Redwood();
*/
}
void go2 (Tree tl, Redwood rl) {
Redwood r2 = (Redwood) tl;
Tree t2 = (Tree)rl;
}
答案 1 :(得分:2)
此行将在运行时抛出异常:
go2 ( (Redwood) new Tree ( ) , new Redwood ( ));
因为您将Tree
对象投射到Redwood
这是不可能的
您的Tree
类是父类,您无法将父类对象向下转换为子类对象。
这是无效的:
(Redwood) new Tree ( )
但事实恰恰相反。
这是完全有效的:
(Tree) new redwood ( )
答案 2 :(得分:2)
Child
类实例可以强制转换为Parent
类引用,因为Child
继承Parent
,Child
应该支持Parent
的所有行为已经支持。
实施例
class Parent {
public void getA() {
return 1;
}
}
class Child extends Parent {
public void getB() {
return 1;
}
}
现在让我们考虑2个对象
Child c = new Child();
Parent p = new Parent();
现在,如果你这样做
Parent p2 = (Parent) c;
这是有效的,因为当您调用p2.getA()
时,它会起作用,因为getA()
方法已经由c
继承,这是{{1}的实例}}
现在,如果你这样做
Child
这不起作用,因为Child c2 = (Parent) p;
的类型为c2
,并且调用Child
有效。但由于实例c2.getB()
的类型为p
,因此它没有Parent
的实现(这是子类继承中添加的新方法)。
简单来说,继承是IS A关系
回到你的问题
getB()
是一个 Redwood
所以Tree
有效。这意味着可以将Tree t = (Tree) (new Redwood());
实例强制转换为Redwood
但Tree
不是 Tree
总是(它可以是任何内容)..所以Reedwood
不起作用
答案 3 :(得分:1)
如果你传递一个树对象,那么它是合法的
Tree t1 = new Redwood ();
因为树可以是红木或某种树...所以你不能在运行时贬低
答案 4 :(得分:0)
选项A:在运行时抛出异常
因为go2 ( (Redwood) new Tree ( ) , new Redwood ( ]
//运行时异常
Becasue你正在将Tree对象转换为Redwood对象,但这是不可能的。 您的Tree类是父类,您不能将父类对象向下转换为子类对象。
答案 5 :(得分:0)
当代码尝试将树向下转换为Redwood时,将抛出ClassCastException。 所以正确的答案是: A
答案 6 :(得分:0)
由于明显的语法错误,该代码无法编译:go方法中的]
没有匹配[
,go方法后的'
没有匹配{{ 1}}。此外,代码缺少两个'
。