博客
关于我
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/

    你可能感兴趣的文章
    npm如何清空缓存并重新打包?
    查看>>
    npm学习(十一)之package-lock.json
    查看>>
    npm安装 出现 npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! 解决方法
    查看>>
    npm安装crypto-js 如何安装crypto-js, python爬虫安装加解密插件 找不到模块crypto-js python报错解决丢失crypto-js模块
    查看>>
    npm安装教程
    查看>>
    npm报错Cannot find module ‘webpack‘ Require stack
    查看>>
    npm报错Failed at the node-sass@4.14.1 postinstall script
    查看>>
    npm报错fatal: Could not read from remote repository
    查看>>
    npm报错File to import not found or unreadable: @/assets/styles/global.scss.
    查看>>
    npm报错TypeError: this.getOptions is not a function
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>
    npm淘宝镜像过期npm ERR! request to https://registry.npm.taobao.org/vuex failed, reason: certificate has ex
    查看>>
    npm版本过高问题
    查看>>
    npm的“--force“和“--legacy-peer-deps“参数
    查看>>
    npm的安装和更新---npm工作笔记002
    查看>>
    npm的常用操作---npm工作笔记003
    查看>>
    npm的常用配置项---npm工作笔记004
    查看>>
    npm的问题:config global `--global`, `--local` are deprecated. Use `--location=global` instead 的解决办法
    查看>>
    npm编译报错You may need an additional loader to handle the result of these loaders
    查看>>
    npm设置淘宝镜像、升级等
    查看>>