【Java专题】类的继承

继承(inheritance)是面向对象编程中的一个重要概念,它允许我们创建一个新类(子类)来继承一个现有类(父类)的属性和方法。通过继承,子类可以重用父类的代码,并且可以添加自己的属性和方法来扩展父类的功能。

继承的语法

在Java中,使用extends关键字来实现继承。

  • 父类也叫做超类(superclass)或基类(base class),子类也叫做派生类(derived class)。
  • Java中的类只支持单继承,即一个子类只能有一个直接父类,但可以通过多层继承来实现类似多继承的效果。
  • 子类可以继承父类的所有非私有成员(属性和方法),并且可以重写(override)父类的方法来提供特定的实现。
  • 如果定义类时没有显式指定父类,则默认继承java.lang.Object类。

重写的规则

  • 子类重写父类的方法时,方法名、参数列表和返回类型必须与父类的方法完全相同
  • 子类重写父类的方法时,访问修饰符不能比父类的方法更严格,但可以更宽松
  • 子类重写父类的方法时,返回类型必须与父类的方法相同,或者是父类方法返回类型的子类型(协变返回类型)
  • 子类重写父类的方法时,可以抛出与父类方法相同的异常或其子类的异常,但不能抛出父类方法未声明的异常
  • 子类重写父类的方法时,可以使用@Override注解来标识该方法是重写父类的方法,这样可以帮助编译器检查是否正确重写

final 关键字

  • 如果一个类被声明为final,则该类不能被继承
  • 如果一个方法被声明为final,则该方法不能被子类重写,但可以被重载
  • 如果一个变量被声明为final,则该变量的值不能被修改

代码示例

1
2
3
4
package study.ghr.pk2;

public final class TestUser2 {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package study.ghr.pk2;

public class TestUser {
String name;
public void hello() {
System.out.println("name: " + name);
}

public final String flag = "flag";

public final void print() {
System.out.println("print");
}

public TestUser(String name) {
this.name = name;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package study.ghr.pk1;

import study.ghr.pk2.TestUser;

//class TestInherit extends TestUser2 {} // 试图继承自final类,编译报错

class TestInherit extends TestUser {
public TestInherit(String name) {
super(name);
}

// 方法名相同+参数相同,视为重写,不被允许
//public void print() {}

// 参数不同,视为重载,可以正常运行
public void print(String msg) {
System.out.println(msg);
}
}