继承的一个例子

abstract class Person{
private String name;

public Person(String n){
name=n;
}

public String getName() {
return name;
}

public abstract String getInformation();
}

class Employee extends Person{
private double salary;

public Employee(String n,double s) {
super(n);
salary=s;
}

public double getSalary() {
return salary;
}

@Override
public String getInformation() {
return "级别:员工、工资:"+getSalary();
}

}

public class MainTest{
public static void main(String[] args){
Person p=new Employee();
}
}


抽象类不能被实例化是说Person p=new Person();这样是错误的;但是Person p=new Employee(); 是可以的,创建子类的实例,父类的引用指向它
在上述主程序中,new Employee后,它会初始化对象,初始化顺序为:
父类静态块初始化---->子类静态块初始化---->父类非静态块初始化---->父类构造方法---->子类非静态块初始化---->子类构造方法。(先静后动,先父后子)
这个主程序会先初始化person类的非静态属性和构造函数再初始化employees类的非静态属性和构造函数

这就是你第一个问题的当子类的父类为抽象类时,构造方法如何追溯?而抽象类作为父类也会创建实例么?没有创建实例只是构造函数在对抽象类Person的属性初始化,对于一个类的声明,赋值 和使用两件事情,前者不需要实例化,后者必须实例化.

抽象类中的构造方法是怎么回事?就是初始化属性的作用
为什么有构造方法却不能实例化?没有这样的说法,只能针对类实例化对象
抽象类不能被实例化,构造函数被可以重载不能被覆盖,构造函数不能被继承
构造函数和类名相同,所以,继承下来也不是构造函数了,还有构造函数是一个对类初始化的特殊方法,代表这个类,一个基类是不可能知道子类会扩展什么,如果继承了就可以不写代码了,那么子类的新属性怎么初始化?当然这2点是我个人的看法。
<think>嗯,用户现在让我用菱形继承举个例子。之前已经讨论过MRO的基本概念,特别是C3算法和经典类与新式类的区别。用户可能是在理解多重继承时遇到了菱形继承的问题,需要具体例子来帮助理解。 首先,我需要确保例子能清晰展示菱形继承的结构,也就是一个子类继承自两个中间类,而这两个中间类又都继承自同一个基类。这样的结构容易导致方法调用冲突,而MRO在这里的作用就是解决这种冲突。 我应该选择Python的新式类,因为经典类的MRO是深度优先,可能会导致意外的行为。用户之前的问题也涉及经典类和新式类的区别,所以用新式类更合适。 接下来,我需要构造四个类:基类A,中间类B和C(都继承自A),最后是子类D继承B和C。在基类A中定义一个方法,比如`show`,然后在中间类中覆盖或者不覆盖这个方法,最后看D调用时的顺序。 例如,如果B没有覆盖`show`,而C覆盖了,那么D的实例调用`show`应该根据MRO找到C的方法。如果B和C都覆盖了,那么MRO的顺序应该是D -> B -> C -> A,所以会先找到B的方法。但如果是菱形结构,C3算法会保持子类优先,并且每个父类的顺序一致,所以D的MRO应该是D, B, C, A。 在回答中,需要明确代码示例,并解释输出结果。同时,指出MRO列表如何通过`__mro__`属性查看,并说明C3算法如何避免重复调用基类,确保每个类只被访问一次。 用户可能还希望知道为什么这样的顺序是合理的,以及如果没有MRO会出现什么问题。比如,在经典类中,可能会先深度遍历到A,导致无法正确调用覆盖的方法,而C3算法解决了这个问题,确保子类的方法优先,同时保持继承顺序。 最后,需要总结菱形继承中MRO的作用,强调C3算法在解决继承顺序问题上的优势,并提醒用户在实际编码中如何查看和利用MRO来理解类的结构。</think>好的!下面用一个经典的**菱形继承**(即“钻石继承”)例子来说明Python中的MRO是如何工作的: --- ### 菱形继承示例 假设有以下类结构: ``` A / \ B C \ / D ``` 其中: - 类`A`是基类; - 类`B`和`C`都继承自`A`; - 类`D`同时继承`B`和`C`,形成一个“菱形”结构。 **代码实现**: ```python class A: def show(self): print("A.show") class B(A): pass # 未覆盖show方法 class C(A): def show(self): print("C.show") class D(B, C): pass d = D() d.show() # 输出什么? ``` --- ### MRO如何解析? 1. **MRO顺序**: Python会按照`D -> B -> C -> A`的顺序查找方法。 通过`D.__mro__`可以查看具体顺序: ```python print(D.__mro__) # 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) ``` 2. **执行逻辑**: - `D`自身没有`show()`方法; - 接下来检查父类`B`(因为`D`继承顺序是`B`在前,`C`在后); - `B`未覆盖`show()`,继续查找`C`; - `C`覆盖了`show()`,因此调用`C.show()`。 **输出结果**: ``` C.show ``` --- ### 为什么选择C而不是A? - **C3算法规则**: Python的MRO(C3算法)满足以下原则: 1. **子类优先于父类**:例如`B`和`C`优先于`A`。 2. **继承顺序保留**:类定义中父类的书写顺序(`D(B, C)`中`B`在前)决定了父类的检查顺序。 3. **避免重复和歧义**:基类`A`只会被访问一次,即使`B`和`C`都继承自它。 --- ### 总结 菱形继承中,MRO通过**C3线性化算法**保证了: 1. 子类方法优先; 2. 父类顺序一致; 3. 避免基类被重复访问。 通过`类名.__mro__`可以查看具体的解析顺序,这对调试复杂的继承关系非常有用!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值