当前位置:首页 > 技术 > 正文内容

Java 面向对象核心:深入理解继承机制与应用

访客 技术 2026年10月27日 1

1. 继承的基础语法与特性

在 Java 中,继承是通过 extends 关键字来实现的。它允许一个类(子类)获取另一个类(父类)的成员变量和成员方法,从而提高代码的复用性。

// 定义父类
public class Device {
    private String brand;
    private double price;

    public String getBrand() { return brand; }
    public void setBrand(String brand) { this.brand = brand; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
}

// 子类继承父类
public class Phone extends Device {
    private int storageSize;

    public int getStorageSize() { return storageSize; }
    public void setStorageSize(int storageSize) { this.storageSize = storageSize; }
}

public class Main {
    public static void main(String[] args) {
        Phone myPhone = new Phone();
        // 子类可以直接使用父类的非私有方法
        myPhone.setBrand("小米");
        myPhone.setPrice(3999.0);
        myPhone.setStorageSize(256);
        System.out.println(myPhone.getBrand() + " 价格: " + myPhone.getPrice());
    }
}

关键规则:

  • 子类只能继承父类的非私有(non-private)成员。
  • Java 支持单继承(一个类只能有一个直接父类),但支持多层继承(A 继承 B,B 继承 C)。
  • Object 类是 Java 中所有类的顶级父类。

2. 权限修饰符的访问范围

Java 提供了四种访问权限修饰符,用于控制成员的可见性:

  • private:仅限当前类访问。
  • 缺省 (default):当前类、同包下的其他类。
  • protected:当前类、同包类、以及其他包中的子类。
  • public:任意位置均可访问。

3. 成员访问的就近原则与 super 关键字

当子类中出现与父类同名的变量或方法时,Java 会遵循就近原则进行访问。如果需要明确访问父类的成员,可以使用 super 关键字。

class Parent {
    String info = "父类属性";
    public void execute() {
        System.out.println("父类执行逻辑");
    }
}

class Child extends Parent {
    String info = "子类属性";

    public void execute() {
        System.out.println("子类执行逻辑");
    }

    public void show() {
        String info = "局部变量";
        System.out.println(info);        // 访问局部变量
        System.out.println(this.info);   // 访问子类成员变量
        System.out.println(super.info);  // 访问父类成员变量

        execute();        // 调用子类方法
        super.execute();  // 调用父类方法
    }
}

4. 方法重写(Method Overriding)

当父类的方法无法满足子类的特定需求时,子类可以重新编写一个方法签名(方法名、形参列表)与父类完全一致的方法。使用 @Override 注解可以帮助检查重写逻辑的正确性。

注意事项:

  • 私有方法和静态方法不能被重写。
  • 子类重写方法的访问权限必须大于或等于父类方法的权限。
class Laptop extends Device {
    // 重写 Object 类的 toString 方法,用于展示对象内容而非地址
    @Override
    public String toString() {
        return "Laptop{Brand=" + getBrand() + ", Price=" + getPrice() + "}";
    }
}

5. 构造器的执行流程

在创建子类对象时,子类的构造器会默认先调用父类的无参构造器,确保父类控制的成员变量能正确初始化。

5.1 使用 super(...) 调用父类构造器

如果父类没有无参构造器,或者需要通过子类构造器初始化父类的私有属性,必须在子类构造器的第一行显式使用 super(...)。

public class Member {
    private String id;
    public Member(String id) { this.id = id; }
}

public class VIPMember extends Member {
    private int level;
    public VIPMember(String id, int level) {
        super(id); // 调用父类构造器
        this.level = level;
    }
}

5.2 使用 this(...) 调用本类构造器

在同一个类中,可以使用 this(...) 在一个构造器里调用另一个构造器,常用于设置默认值。

public class Config {
    private String host;
    private int port;

    public Config(String host) {
        // 调用本类双参构造器,默认端口 8080
        this(host, 8080);
    }

    public Config(String host, int port) {
        this.host = host;
        this.port = port;
    }
}

注意:this(...) 和 super(...) 都必须位于构造器的首行,因此它们不能在同一个构造器中共存。

标签: Java

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。