java - 为什么变量在覆盖时的行为与方法不同。?

标签 java inheritance overriding

<分区>

一般Overriding是在子类中重新定义成员的含义的概念。为什么java中Overriding时变量的行为不像方法?
例如:

class Base {

    int a = 10;

    void display() {
        System.out.println("Inside Base :");
    }
}

class Derived extends Base {

    int a = 99;

    @Override
    // method overriding
    void display() {
        System.out.println("Inside Derived :");
    }
}

public class NewClass {

    public static void main(String... a) {
        Derived d = new Derived();
        Base b = d;
        b.display(); // Dynamic method dispatch
        System.out.println("a=" + b.a);
    }
}

由于数据成员a 是包访问指定的,它也可用于Derived 类。但是一般在使用基类引用调用重写的方法时,派生类中重新定义的方法被调用(动态方法调度)..但是变量不一样..为什么.?

预期输出

内部派生:
a=99

获得的输出:

内部派生:
a=10

打印 10 - 为什么变量的行为与派生类中的方法不同?
为什么不允许在子类中重写变量?

最佳答案

您键入 b 作为 Base 的实例。因此,当编译器需要解析 b.a 时,它会查看 Base 的定义以了解 b.a 的含义。实例字段没有多态性。

关于java - 为什么变量在覆盖时的行为与方法不同。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17201227/

相关文章:

java - 如何从 Spring Boot War 应用程序访问 gradle.properties 文件值?

java - 当多个模块使用同一个jar时,如何克服jar依赖 hell ?

c++ - vector.push_back(B) 和 vector.push_back(new A((*B))),为什么不一样呢?

java - 为什么这个 protected 成员在子类中不可见

javascript - 如何使用子主题 js 文件从父主题 main.js 文件中删除 javascript 函数

java - 单元测试覆盖调用 super() 的方法

java - 如何在 JBoss 中配置 SQL Server 数据源以使用特定的 Active Directory 用户进行连接?

java - 使用注释创建原型(prototype)范围的 Spring bean?

postgresql - (如何)是否可以将表转换为 Postgres 中的外部表?

C++继承函数中的默认操作