博客
关于我
7.JAVA-类继承、覆写、final关键字
阅读量:437 次
发布时间:2019-03-06

本文共 3381 字,大约阅读时间需要 11 分钟。

Java 继承与 final 修饰

在 Java 编程中,继承是实现类之间关系的重要方式,extends 是实现继承的关键字。通过继承,派生类可以继承基类的属性和方法,从而减少代码冗余。然而,Java 的继承机制也有其自身的限制和特殊规则,理解这些规则对于代码的正确编写至关重要。本文将详细探讨 Java 的继承机制以及 final 修饰符的使用。


1. Java 继承 - extends 的使用

在 Java 中,extends 用于定义派生类(subclass),派生类可以继承基类(superclass)的属性和方法。派生类被称为子类,基类被称为父类。

extends 的注意事项

  • 单一继承支持

    Java 不支持多重继承(multiple inheritance),一个类只能继承一个父类,不能继承多个父类。

  • 私有属性访问限制

    派生类无法直接访问基类的私有属性(private fields)。基类的私有属性在派生类中是不可见的,只有通过公共方法可以间接访问。

  • 实例化顺序

    当实例化派生类时,首先会调用基类的构造方法(super constructor),然后是派生类的构造方法。派生类可以通过隐藏的 super 调用基类的构造方法,指定基类的初始化方式。

  • 隐藏的 super 方法

    在派生类中,super 是一个隐藏的引用,表示基类。通过 super 可以访问基类的方法和属性,并在派生类的方法中调用基类的方法。


  • 1.1 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()

    2. Java 继承 - 方法覆写(overriding)

    当派生类需要覆盖基类的方法时,必须遵守以下规则:

  • 方法的权限

    派生类覆写的方法必须与基类方法的权限一致,包括访问级别(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()

    2.2 派生类无法覆写基类的私有方法示例

    基类修改为私有方法

    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()"    }}

    2.3 调用基类被覆盖的方法

    在派生类中,可以通过 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()

    3. Java final 修饰符

    final 是一个终结器,用于修饰类、方法和变量。它的作用是限制代码的修改,确保代码的稳定性和安全性。

    3.1 final 修饰类

    当一个类被 final 修饰时,表示该类是终结类,不能再有子类。

    final class A {}class B extends A { // 错误,B 不能继承 A}

    3.2 final 修饰方法

    当一个方法被 final 修饰时,表示该方法不能在子类中被覆写,但仍然可以通过方法重载实现。

    class A {    public final void fun() {} // 不能在子类中覆写    public void fun(int i) {} // 可以通过方法重载实现}class B extends A {    public void fun() {} // 错误,不能覆写}

    3.3 final 修饰变量

    在 Java 中,final 修饰的变量是常量,不能被修改。

    public static final String LICENSE = "GPL"; // 全局常量

    下一章学习

    理解 Java 的继承与 final 修饰是掌握对象编程的关键。接下来,我们将深入探讨 Java 的抽象类、接口以及多态性(polymorphism)。

    转载地址:http://tviyz.baihongyu.com/

    你可能感兴趣的文章
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>
    python列表前几个_python之列表
    查看>>
    python列表元组
    查看>>
    Python列表/元组/字典和集合使用
    查看>>
    python列表 行列选择_python_pandas_dataframe_行列选择_切片操作
    查看>>
    python列表
    查看>>
    python列出当前目录、子目录和文件的脚本
    查看>>
    python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
    查看>>
    Python切片对象和__getitem__
    查看>>
    python+flask计算机毕业设计高校体育竞赛成绩管理系统的设计与实现(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
    查看>>