鉴于这段代码:
public static void main(String[] args)
{
C c = new A();
B bl = (B)(new A());
B b2 = new D();
A a = new D();
}
我被要求根据给定的代码确定类之间的关系,并从下面的列表中选择正确的答案:
C继承自A,B继承自A,D继承自A。
A继承自C,B继承自A,D继承自A。
C继承自A,B继承自A,D继承自B.
A继承自C,C继承自B,D继承自A。
A继承自C,B继承自A,D继承自B, C继承自B。
从第一行开始,我确定A继承自C(由于向上转换),这消除了选项1和3。
第二行对我来说有些问题。我不知道我是否正确,但是我用它来断定A不会从B继承,因为否则铸造不是必要的。
从第三行开始,我确定D继承自B,而第四行则继承自A。
根据一些回答这个问题的网站,正确的答案是选项4.我理解,因为这是部分包含我得出的结论的唯一选择,而其余的包含明显的错误或不支持的声明。我不明白的是,为什么C继承自B? (根据选项4)。我无法从代码中的任何地方得出结论。
为什么这是真的?将非常感谢帮助:)
答案 0 :(得分:0)
根据第4个答案,依赖树看起来像(从最顶层开始):
B->C->A->D
,分解为:
public static void main(String[] args)
{
C c = new A(); // C->A (direct parent)
B bl = (B)(new A()); // B->C->A (2 levels up), casting to B can be avoided
B b2 = new D(); // B->C->A->D (3 levels up)
A a = new D(); // A->D (direct parent)
}
这是唯一一个适用于所有代码行的选项,无一例外。
答案 1 :(得分:0)
仅仅因为没有必要进行施法并不意味着你可以明确拼写出来。你是对的 - 从技术上讲你不需要(B):
B bl = (B)(new A());
无论如何,获取此依赖关系树并不一定简单。这就是你真正知道的:
非常重要的是要认识到,仅仅因为你知道A继承自C 而不是意味着A是C的直接子节点。在继承图中它们之间可能存在其他类。< / p>
假设没有任何其他类(对于所有你知道的,在这两个类之间有一个'E'类),实际上有两种方法来绘制它 - 没有足够的信息来判断它是什么
选项A:C是基类
C是基类 - 没有理由不能,因为它不是来自其他任何东西。 A必须来自B和C,所以B必须在A和C之间的树上。同样,D来自A,使其成为一条长链:
public class A : B { }
public class B : C { }
public class C { }
public class D : A { }
选项B:B是基类。
B是基类。毕竟,它不是来自任何东西,所以没有理由不能。与第一个选项类似,A必须从B和C得到,这意味着C直接在A和B之间的链上。同样,D来自A,因此它位于长链的底部。 / p>
public class A : C { }
public class B { }
public class C : B { }
public class D : A { }
所以,当这一切都说完了: