继承(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 TestUser { public TestInherit(String name) { super(name); }
public void print(String msg) { System.out.println(msg); } }
|