假设我的情况如下:
class Base{
public Base() {
System.out.println("Base");
}
}
class Derived extends Base{
public Derived(){
System.out.println("Devired");
}
}
class DeriDerived extends Derived{
public DeriDerived(){
System.out.println("DeriDevired");
}
}
我不太清楚继承是如何工作的,例如,如果我尝试:Derived b = new DeriDerived();
和DeriDerived b1 = new DeriDerived();
,它们都会产生相同的结果。
对于第二种情况:DeriDerived b1 = new DeriDerived();
DeriDerived 将调用其 Derived 的超类>, Devired 将再次调用其超类 Base ,因此最后我们将得到结果: Based / Devired / DeriDerived 。
但是对于第一种情况,我不明白它是如何工作的,以获得与基于/ Devired / DeriDerived
相同的结果任何人都可以帮忙解释一下吗?
非常感谢你!
答案 0 :(得分:1)
这两个对象都是deriderived的实例,因此它们的行为相似
他们只是共享相同的构造函数
但是如果你在类中有其他方法,你将只能访问derived和base中的方法(在第一个场景中),而在第二个场景中,你将能够访问父类中的所有方法。
不建议这样做,因为它会给你的代码带来一些歧义。
答案 1 :(得分:1)
在java中,保存对象引用的变量不会影响对象的创建。
在所有情况下,您都在调用DeriDerived
构造函数,但是这样创建的对象可以通过以下类型引用:DeriDerived,Devired,Base,Object。
但在每种情况下,您都有不同的方法可见性。
因此,当您创建DeriDerived的实例但由Devired引用它时,您将只能访问Devired和Base类中的方法。你不会看到来自DeriDerived类的事件,虽然这将是对同一个对象的引用 - > DeriDerived。
答案 2 :(得分:0)
创建对象时
Derived d=new DeriDerived()
内部默认构造函数的第一个语句是 super()
super关键字也可用于调用或调用父类构造函数。构造函数从下到上调用并从上到下执行。所以它的工作方式如下
DeriDerived()构造函数以DeriDerived方式调用Derived()构造函数 构造函数的第一个语句是super(),它调用父构造函数,即 Derived()构造函数。
Derived()构造函数调用Base()构造函数
Base()构造函数调用对象类构造函数作为对象是父类。
但在以下层次结构中执行Base() - >衍生的() - > DeriDerived()
调试此代码
class Base{
public Base() {
super();
System.out.println("Base");
}
}
class Derived extends Base{
public Derived(){
super();
System.out.println("Devired");
}
}
class DeriDerived extends Derived{
public DeriDerived(){
super();
System.out.println("DeriDevired");
}
}
答案 3 :(得分:0)
参见两个对象创建 派生b = new DeriDerived(); 和 DeriDerived b1 = new DeriDerived();
你正在调用相同的引用,与引用调用有关,即使用b或b1,它们都创建相同的实例,这就是它们给出相同结果的原因。
如果您想要有所不同,那么在每个类中创建公共方法并尝试使用引用进行访问。
使用子类引用(即使用b1),您可以访问Derived类方法,但是使用超类引用(即使用b),您将无法访问子类(DeriDerived)类方法< / p>