第五章 子类与继承
5.1 子类与父类的关系
5.1.1 子类的定义
子类,亦称为派生类,是从父类(或称为超类、基类)中继承属性和方法的一种类。通过继承机制,子类能够复用父类的代码,这不仅显著提升了代码的复用性,还极大地增强了代码的可维护性。
5.1.2 类的继承体系
在Java编程语言中,类的继承关系通常被描绘为一种树状结构,其中Object类作为树的根基,所有的类都直接或间接地继承自Object类。
5.2 子类的继承特性
5.2.1 同包中的继承
若子类与父类位于同一个包内,子类将能够继承父类的所有非私有成员,这包括属性和方法。
5.2.2 不同包中的继承
当子类与父类不在同一个包时,子类仅能继承父类的protected和public成员,而无法访问默认(包级私有)和private成员。
5.2.3 UML图表示继承关系
在UML(统一建模语言)的图形表示中,继承关系通常通过一个空心箭头来展示,箭头指向父类,以此形象地描绘出类之间的继承联系。
5.2.4 protected修饰符的说明
protected修饰符允许子类访问父类的成员,即使这些类位于不同的包中。这是protected修饰符与默认访问修饰符(包级私有)之间的主要区别。
5.3 子类与对象的关系
5.3.1 子类对象的特性
子类对象不仅能够访问自身类中定义的成员,还能访问从父类继承而来的成员。在实例化子类对象时,Java编译器会确保首先调用父类的构造方法,以完成父类部分的初始化。
5.3.2 instanceof运算符的使用
instanceof运算符是Java中用于检测一个对象是否属于某个特定类或其子类的实例的运算符。其语法格式为:对象 instanceof 类,返回的结果是一个布尔值。
5.4 成员变量的隐藏与方法的重写
5.4.1 成员变量的隐藏
如果子类中定义了与父类同名的成员变量,那么父类中的同名变量将被隐藏。在这种情况下,子类中的变量将覆盖父类中的变量。要访问被隐藏的父类成员变量,可以使用super关键字。
5.4.2 方法的重写
子类可以重写父类中的方法,以提供更符合子类特性的实现。重写的方法必须与父类方法具有相同的名称、返回类型和参数列表。
5.5 super关键字的作用
5.5.1 访问被隐藏的成员
super关键字在Java中用于引用父类的成员,特别是在成员被隐藏或方法被重写的情况下。通过使用super.variable或super.method(),可以访问被隐藏的父类成员或调用被重写的方法。
5.5.2 调用父类的构造方法
在子类的构造方法中,可以通过super关键字调用父类的构造方法。这一调用必须是子类构造方法中的第一条语句,以确保父类部分得到正确的初始化。
5.6 final关键字的应用
5.6.1 final类
被标记为final的类无法被其他类继承。这通常用于保护那些不希望被修改的类。
5.6.2 final方法
被声明为final的方法无法被子类重写。这通常用于保护那些不希望被改变的方法的行为。
5.6.3 常量
使用final修饰的变量被称为常量。一旦常量被赋值后,其值就不能再被更改。这通常用于定义那些在整个程序中都不会改变的值。
5.7 对象的上转型
上转型对象是指将子类对象的引用赋值给父类类型的变量。在这种情况下,该对象只能访问父类中定义的成员,而无法直接访问子类特有的成员。
5.8 继承与多态性
多态性是面向对象编程中的一个重要概念,它允许同一个方法在不同的类中以不同的方式实现。在Java中,多态性主要通过方法重写和接口实现来实现。
5.9 抽象类与抽象方法
抽象类是一种无法被实例化的类,它只能被其他类继承。抽象方法是没有具体实现的方法,它必须在非抽象子类中被重写。抽象类和抽象方法通常用于定义一组相关的类和方法,但不提供具体的实现细节。
示例:
public abstract class Animal { // 抽象方法,没有具体实现 public abstract void sound(); } public class Dog extends Animal { // 重写父类的抽象方法 @Override public void sound() { System.out.println("Woof"); } }
在这个示例中,Animal
是一个抽象类,它定义了一个抽象方法sound()
。Dog
类继承自Animal
类,并重写了sound()
方法,提供了具体的实现。