Java继承

继承

主要目的:
  1. 代码复用:通过继承可以将公共属性和方法提取到父类中,从而避免在子类中重复编写相同的代码,提高了代码的重用性。

  2. 代码扩展:子类可以继承父类的成员属性和方法,并在此基础上增加新的属性和方法,从而扩展了代码的功能。

  3. 统一接口:通过继承可以实现统一接口,即所有的子类都具有相同的方法和属性,方便程序的扩展和管理。

  4. 多态性:通过向上转型和动态绑定的机制,可以实现多态性,即同一操作作用于不同的对象,可以产生不同的结果,提高代码的灵活性。

介绍:

Java的继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。

  1. 定义子类:通过关键字extends来定义子类,并指定父类的名称。
public class SubClass extends SuperClass {
    // 子类的成员变量和成员方法
}
  1. 子类继承父类的属性和方法:子类继承了父类的所有非私有成员属性和方法,可以直接使用。

  2. 重写父类方法:子类可以重写父类的方法,即在子类中重新定义一个同名的方法,但是必须保证参数列表和返回值类型与父类相同,权限修饰符不小于父类,同时可以添加新的功能。

public class SubClass extends SuperClass {

    @Override
    public void printName() {
        super.printName();
        System.out.println("This is SubClass.");
    }
}
  1. 使用super调用父类构造函数和方法:子类可以使用super关键字来调用父类的构造函数和方法,可以用于初始化父类的属性和调用父类的方法。
public class SubClass extends SuperClass {

    public SubClass(String name, int age) {
        super(name, age); // 调用父类构造函数初始化父类属性
    }

    public void printInfo() {
        super.printName(); // 调用父类方法
        System.out.println("The age is " + super.getAge()); // 调用父类的getter方法
    }
}
  1. 多级继承:Java中支持多级继承,即在子类中继续定义子类,从而形成一个继承层次结构。

  2. 继承的限制:Java中的继承遵循一些限制,比如不能继承final类、不能访问父类的私有成员、不能重写父类的final方法等。

继承与构造方法的关系

主要体现在以下两个方面:

  1. 子类构造方法必须调用父类构造方法:当一个子类被实例化时,它的构造方法必须先调用其直接父类的构造方法,以初始化从父类继承而来的属性。如果子类没有显式地调用父类的构造方法,Java会自动调用父类的默认构造方法。

  2. 父类构造方法对子类的影响:当父类的构造方法被调用时,它会初始化父类中定义的成员变量,并且可能执行一些其他的操作。如果子类继承了父类中的属性或方法,那么在子类的构造方法中,需要先调用父类的构造方法,以确保父类的属性得到正确的初始化。

具体来说,当子类被实例化时,Java会按照如下的规则进行构造方法的调用:

  • 先调用父类的构造方法,以初始化从父类继承的属性;
  • 再调用子类的构造方法,以初始化子类特有的属性。

如果子类没有显式地调用父类的构造方法,则Java会自动调用父类的默认构造方法。如果父类没有提供默认构造方法,则子类的构造方法必须显式地调用父类的构造方法。

以下是一个示例代码,展示了子类构造方法调用父类构造方法的过程:

class SuperClass {
    private int value;

    public SuperClass(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

class SubClass extends SuperClass {
    private String name;

    public SubClass(int value, String name) {
        super(value); // 调用父类构造方法
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

// 创建子类对象
SubClass subObj = new SubClass(10, "Tom");

// 获取子类和父类的属性值
int value = subObj.getValue(); // 通过父类的Getter方法获取属性值
String name = subObj.getName(); // 获取子类的属性值

继承的缺点
  1. 父类的变化对子类的影响:当修改父类的实现时,可能会对子类产生意想不到的影响,导致程序出现错误。

  2. 方法重写的歧义:如果在子类中重写了父类的方法,但是没有正确地覆盖父类的同名方法,就会导致程序出现歧义。

  3. 子类过多的依赖于父类:过度使用继承可能导致子类过于依赖于父类,导致代码的耦合度过高,使得代码难以重构和维护。

  4. 向上转型的限制:当将子类向上转型为父类时,会丢失子类特有的属性和方法,导致功能受到限制。

  5. 过度设计的问题:如果过度依赖继承,可能导致出现过度设计,即设计过于复杂而不易维护的代码结构。

  6. 继承链的深度:继承链过长可能导致代码的性能下降,因为每次访问继承链中的属性和方法时都需要进行一次查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奕の辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值