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

    你可能感兴趣的文章
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理二
    查看>>
    Netty源码解读
    查看>>
    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
    查看>>
    Netty相关
    查看>>
    Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
    查看>>
    Network Sniffer and Connection Analyzer
    查看>>
    NetworkX系列教程(11)-graph和其他数据格式转换
    查看>>
    Networkx读取军械调查-ITN综合传输网络?/读取GML文件
    查看>>
    Net与Flex入门
    查看>>
    net包之IPConn
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS网络文件系统
    查看>>
    nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
    查看>>
    ng 指令的自定义、使用
    查看>>
    Nginx
    查看>>