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

Java子类能否继承父类的静态成员并实现多态

访客 技术 2026年7月9日 1

在Java中,使用static关键字修饰的成员(变量和方法)属于类本身,而非某个具体对象。这意味着静态成员在类加载时分配唯一的内存空间,所有该类的实例共享此空间。静态方法有以下限制:

  • 只能调用其他静态方法
  • 只能访问静态数据
  • 不能使用thissuper关键字

当存在继承关系时,如果子类没有定义与父类同名的静态成员,子类对象可以访问父类的静态成员,但子类并不会"继承"这些静态成员——它们仍然属于父类。

关键问题在于:如果子类和父类都有同名的静态变量或方法,是否会发生"重写"并呈现多态?答案是否定的。看以下示例:

父类:

public class Parent {
    public static void staticMethod(){
        System.out.println("Parent staticMethod run");
    }
    
    public void method(){
        System.out.println("Parent method run");
    }
}

子类:

public class Son extends Parent {
    public static void staticMethod(){
        System.out.println("Son staticMethod run");
    }
    
    public void method(){
        System.out.println("Son method run");
    }
}

测试代码:

public class Test {
    public static void main(String[] args) {
        Parent ref = new Son();
        ref.staticMethod();  // 输出:Parent staticMethod run
        ref.method();        // 输出:Son method run
        
        Son s = new Son();
        s.staticMethod();    // 输出:Son staticMethod run
    }
}

输出结果:

Parent staticMethod run
Son method run
Son staticMethod run

可以看到,当用父类引用指向子类对象时,staticMethod()调用的是父类版本,因为静态方法基于引用类型(静态绑定)而非对象类型(动态绑定)。而普通方法method()则表现出多态行为,调用了子类版本。

静态成员在子类中无法被"重写"。即使子类定义了同名的静态方法或变量,它们与父类的版本完全独立,分别属于各自的类。调用时取决于引用类型,而非实际对象类型。

那么子类能否访问父类的静态成员?看以下代码:

public class Parent {
    public static void staticMethod(){
        System.out.println("Parent staticMethod run");
    }
}

public class Son extends Parent {
    // 未定义任何静态方法
}

测试:

public class Test {
    public static void main(String[] args) {
        Parent p = new Son();
        p.staticMethod();  // Parent staticMethod run
        Son s = new Son();
        s.staticMethod();  // Parent staticMethod run
    }
}

输出表明,子类可以访问父类的静态方法(通过类名或对象引用),但这不是继承——它只是类名解析或引用类型转换的结果。静态变量同理。

总结:

  • 子类不会继承父类的静态变量和方法,但可以通过类名或对象引用访问它们(前提是子类未定义同名成员)。
  • 子类与父类同名的静态成员完全独立,不存在重写关系,因此无法实现多态。
  • 静态成员基于静态绑定(编译时绑定),而非动态绑定(运行时绑定),这是其与实例成员的核心区别。

相关文章

Linux crontab 详解

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

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...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

PHPStan 有什么用?怎么用?

PHPStan 是一个 PHP 的静态分析工具,在不运行代码的情况下就能帮你发现潜在问题,比如:传错类型(把 string 传给接受 int 的函数)访问不存在的属性 / 方法null 没处理好永远不会执行到的代码数组 key/值类型不一致返回值不符合声明注释和真实类型不匹配它非常适合:想提升代码质量、减少线上 bug、统一团队风格的人(尤其是中大型项目)。一、PHPStan 有什么用(通俗点说)...

发表评论

访客

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