java中多态的属性和方法

在 Java 中,‌多态 ‌主要体现在‌方法 ‌上,而‌属性(成员变量)不具有多态性‌。这是 Java 多态机制的核心规则之一。

多态中方法的行为

  • ‌方法调用遵循"编译看左边,运行看右边"原则‌:

    • ‌编译阶段‌:检查父类引用是否声明了该方法。
    • ‌运行阶段 ‌:实际调用的是‌子类重写后的方法‌(如果子类重写了该方法)。
  • ‌前提条件‌:

    1. 存在‌继承关系‌(子类继承父类或实现接口)。
    2. 子类‌重写‌(override)父类方法。
    3. 使用‌父类引用指向子类对象‌(向上转型)。
  • ‌示例‌:

    class Animal {
    void eat() {
    System.out.println("动物吃东西");
    }
    }

    class Dog extends Animal {
    @Override
    void eat() {
    System.out.println("狗吃骨头");
    }
    }

    public class Test {
    public static void main(String[] args) {
    Animal a = new Dog(); // 向上转型
    a.eat(); // 输出:狗吃骨头(运行时调用子类重写的方法)
    }
    }

多态中属性的行为

  • ‌**属性访问始终"编译看左边,运行也看左边"**‌:

    • 无论实际对象是哪个子类,‌访问的是父类引用类型中定义的属性‌。
    • ‌属性不会被重写‌,子类中同名属性只是"隐藏"了父类属性,而非覆盖。
  • ‌示例‌:

    class Parent {
    int value = 10;
    }

    class Child extends Parent {
    int value = 20; // 隐藏父类属性,不是重写
    }

    public class Test {
    public static void main(String[] args) {
    Parent p = new Child();
    System.out.println(p.value); // 输出:10(父类的 value)
    }
    }

其他不具有多态性的成员

以下成员‌不支持多态‌,编译期就确定调用哪个版本:

  • ‌静态方法 ‌(static):调用取决于引用类型。
  • ‌私有方法 ‌(private):不能被子类重写。
  • ‌**final 方法**‌:不能被重写。
  • ‌构造方法‌:不属于继承体系,不参与多态。

**示例:**静态方法无多态

复制代码
class A { static void show() { System.out.println("A"); } }
class B extends A { static void show() { System.out.println("B"); } }
A a = new B();
a.show(); // 输出 "A",不是 "B"

备注

  • 方法 ‌:多态 → ‌运行时动态绑定‌,调用子类重写的方法。
  • 属性 ‌:‌无多态‌ → 始终访问父类引用中的属性。
  • 注意:若需访问子类特有属性或方法,必须进行‌向下转型 ‌,并使用 instanceof 安全判断。
相关推荐
看浪的路人9 分钟前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
大侠归来20 分钟前
事务能回滚吗?Pipeline 算事务吗?
java·数据库·oracle
蜗牛互联网21 分钟前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
Wang's Blog41 分钟前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
Wang's Blog43 分钟前
Java 项目实战:交友项目 —— 项目导读与整体架构
java·架构·交友
今年下半年1 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
wespaul1 小时前
VeapAI 自然语言操作实战|第 04 篇:系统数据加工——把系统自身的元数据吃成知识
java·大数据·运维·数据库·人工智能
幼儿园蛋小黑1 小时前
SPI 子系统:从原理到实践
java·前端·数据库
yangmu32032 小时前
Unity 开发过程与底层原理
java·开发语言
lexiangqicheng2 小时前
自定义表单跨端共用机制-PC设计APP渲染
java·前端·javascript