询问Java中的继承
假设我的情况如下:询问Java中的继承,java,inheritance,Java,Inheritance,假设我的情况如下: class Base{ public Base() { System.out.println("Base"); } } class Derived extends Base{ public Derived(){ System.out.println("Devired"); } } class DeriDerived extends Derived{ public DeriDerived(){
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-Derived()代码>和derivered b1=新的derivered()代码>,它们都生成相同的结果
对于第二种情况:derivered b1=new derivered()代码>我所理解的(可能是正确的,可能不是???)DeriDerived将调用其派生的超类,而Deviled将再次调用其基础的超类,因此最后我们将得到类似于:Based/Devired/DeriDerived的结果
但对于第一种情况,我不明白它是如何工作的,以获得与基于/偏差/衍生相同的结果
谁能帮我解释一下吗
非常感谢你 两个对象都是派生对象的实例,因此它们的行为相似。
它们只共享同一个构造函数。
但是,如果类中有其他方法,则只能访问派生类和基类中的方法(在第一种方案中),而在第二种方案中,可以访问父类中的所有方法。
不建议这样做,因为这会给代码带来一些歧义。这两个对象都是派生对象的实例,因此它们的行为类似。
它们只共享同一个构造函数。
但是,如果类中有其他方法,则只能访问派生类和基类中的方法(在第一种方案中),而在第二种方案中,可以访问父类中的所有方法。
不建议这样做,因为这样会给代码带来一些歧义。在java中,保存对对象引用的变量不会影响对象的创建
在所有情况下,您都在调用derivered
构造函数,但这样创建的对象可以按类型引用:derivered、Devired、Base、object
但在每种情况下,您都有不同的方法可见性
因此,当您将创建derivered的实例,但由Devired引用它时,您将只能访问Devired和基类中的方法。您将不会看到来自DeriDerived类的方法,尽管这将是对同一对象->DeriDerived的引用。在java中,保存对对象引用的变量不会影响对象的创建
在所有情况下,您都在调用derivered
构造函数,但这样创建的对象可以按类型引用:derivered、Devired、Base、object
但在每种情况下,您都有不同的方法可见性
因此,当您将创建derivered的实例,但由Devired引用它时,您将只能访问Devired和基类中的方法。您将不会看到DeriDerived类中的方法,尽管这将是对同一对象->DeriDerived的引用。当您创建对象时
Derived d=new DeriDerived()
内部默认构造函数的第一个语句是super()
super关键字还可用于调用父类构造函数。构造函数从下到上调用,从上到下执行
DeriDerived()构造函数作为DeriDerived调用派生()构造函数
构造函数的第一个语句是super(),它调用父构造函数,即
派生()构造函数
对Base()构造函数的派生()构造函数调用
Base()构造函数调用对象类构造函数,因为对象是父类
但在以下层次结构中执行Base()-->Derived()-->derivered()
调试此代码
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");
}
}
创建对象时
Derived d=new DeriDerived()
内部默认构造函数的第一个语句是super()
super关键字还可用于调用父类构造函数。构造函数从下到上调用,从上到下执行
DeriDerived()构造函数作为DeriDerived调用派生()构造函数
构造函数的第一个语句是super(),它调用父构造函数,即
派生()构造函数
对Base()构造函数的派生()构造函数调用
Base()构造函数调用对象类构造函数,因为对象是父类
但在以下层次结构中执行Base()-->Derived()-->derivered()
调试此代码
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");
}
}
请参见创建两个对象中的
派生b=新的派生()和衍生b1=新衍生()强>
您调用的是相同的引用,这意味着使用引用调用,即使用b或b1,它们都在创建相同的实例,这就是它们给出相同结果的原因
如果您想有所不同,那么在每个类中创建公共方法,并尝试使用引用进行访问
使用子类引用(即使用b1)可以访问派生类方法,但使用超类引用(即使用b)将无法访问子类(派生)类方法参见两个对象的创建
派生b=新的派生()和衍生b1=新衍生()强>
您调用的是相同的引用,这意味着使用引用调用,即使用b或b1,它们都在创建相同的实例,这就是它们给出相同结果的原因
如果您想有所不同,那么在每个类中创建公共方法,并尝试使用引用进行访问
使用子类引用(即使用b1)可以访问派生类方法,但使用超类引用(即使用b)将无法访问子类(派生)类方法在两个示例中调用相同的构造函数。为什么它会生成不同的结果?存储构造函数结果(实例)的变量类型不会影响构造。它将只定义框的类型,然后定义可访问的属性(方法、变量)。但是您仍然创建相同的类型