本文共 3381 字,大约阅读时间需要 11 分钟。
在 Java 编程中,继承是实现类之间关系的重要方式,extends 是实现继承的关键字。通过继承,派生类可以继承基类的属性和方法,从而减少代码冗余。然而,Java 的继承机制也有其自身的限制和特殊规则,理解这些规则对于代码的正确编写至关重要。本文将详细探讨 Java 的继承机制以及 final 修饰符的使用。
extends 的使用在 Java 中,extends 用于定义派生类(subclass),派生类可以继承基类(superclass)的属性和方法。派生类被称为子类,基类被称为父类。
extends 的注意事项单一继承支持
Java 不支持多重继承(multiple inheritance),一个类只能继承一个父类,不能继承多个父类。私有属性访问限制
派生类无法直接访问基类的私有属性(private fields)。基类的私有属性在派生类中是不可见的,只有通过公共方法可以间接访问。实例化顺序
当实例化派生类时,首先会调用基类的构造方法(super constructor),然后是派生类的构造方法。派生类可以通过隐藏的super 调用基类的构造方法,指定基类的初始化方式。隐藏的 super 方法
super 是一个隐藏的引用,表示基类。通过 super 可以访问基类的方法和属性,并在派生类的方法中调用基类的方法。super 方法的使用示例super 必须在派生类的构造方法中首行使用。如果没有显式调用 super,编译器会默认调用基类的无参构造方法(super())。
class Parent { public Parent() { System.out.println("Parent()"); } public Parent(String str) { System.out.println("Parent(String str): " + str); }}class Derived extends Parent { public Derived() { super("123"); // 调用 Parent 的 String 构造方法 System.out.println("Derived()"); }}public class Test { public static void main(String[] args) { Derived d = new Derived(); }} Parent(String str): 123Derived()
当派生类需要覆盖基类的方法时,必须遵守以下规则:
方法的权限
派生类覆写的方法必须与基类方法的权限一致,包括访问级别(public、protected、private)和返回类型。返回值类型
派生类覆写的方法的返回值类型必须与基类方法一致。参数类型
派生类覆写的方法的参数类型必须与基类方法一致。如果派生类覆写的基类方法是私有方法,则无法实现覆写,因为私有方法在派生类中是不可见的。
class Parent { public void func(int i) { System.out.println("Parent::func()"); }}class Derived extends Parent { public void func(int i) { System.out.println("Derived::func()"); }}public class Test { public static void main(String[] args) { Derived d = new Derived(); d.func(1); }} Derived::func()
class Parent { private void func() { System.out.println("Parent::func()"); } public void print() { func(); }}class Derived extends Parent { public void func() { System.out.println("Derived::func()"); }}public class Test { public static void main(String[] args) { Derived d = new Derived(); d.print(); }} class Parent { private void func() { System.out.println("Parent::func()"); } public void print() { func(); }}public class Test { public static void main(String[] args) { // 输出将为 "Parent::func()" }} 在派生类中,可以通过 super 调用基类的方法。例如:
class Parent { public void func() { System.out.println("Parent::func()"); }}class Derived extends Parent { public void func() { super.func(); // 调用 Parent 的 func 方法 System.out.println("Derived::func()"); }}public class Test { public static void main(String[] args) { Derived d = new Derived(); d.func(); }} Parent::func()Derived::func()
final 修饰符final 是一个终结器,用于修饰类、方法和变量。它的作用是限制代码的修改,确保代码的稳定性和安全性。
final 修饰类当一个类被 final 修饰时,表示该类是终结类,不能再有子类。
final class A {}class B extends A { // 错误,B 不能继承 A} final 修饰方法当一个方法被 final 修饰时,表示该方法不能在子类中被覆写,但仍然可以通过方法重载实现。
class A { public final void fun() {} // 不能在子类中覆写 public void fun(int i) {} // 可以通过方法重载实现}class B extends A { public void fun() {} // 错误,不能覆写} final 修饰变量在 Java 中,final 修饰的变量是常量,不能被修改。
public static final String LICENSE = "GPL"; // 全局常量
理解 Java 的继承与 final 修饰是掌握对象编程的关键。接下来,我们将深入探讨 Java 的抽象类、接口以及多态性(polymorphism)。
转载地址:http://tviyz.baihongyu.com/