gpt4 book ai didi

java - 隐藏类的实例变量

转载 作者:太空宇宙 更新时间:2023-11-04 14:36:38 27 4
gpt4 key购买 nike

我想知道为什么 Java 对于具有相同名称的实例变量的父类(super class)和子类有这种奇怪的行为。

假设我们有以下类定义:

class Parent {
int var = 1;
}

class Child extends Parent {
int var = 2;
}

通过这样做,我们应该隐藏了父类(super class)的变量var。如果我们没有明确指定通过 super 调用访问 Parentvar 的方法,那么我们永远无法访问var 来自子实例。

但是当我们进行强制转换时,这种隐藏机制就会崩溃:

Child child = new Child();
Parent parent = (Parent)child;
System.out.println(parent.var); // prints out 1, instead of 2

这不是完全规避了字段隐藏的全部意义吗?如果真是这样的话,那这个想法岂不是完全没用了?

编辑:我特指 this article在 Java 教程中。其中提到

Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super...

从我读到的内容来看,这似乎暗示 Java 开发人员在执行此操作时考虑了某种技术。尽管我同意这是一个相当模糊的概念,并且一般来说可能是不好的做法。

最佳答案

在 Java 中,数据成员不是多态的。这意味着 Parent.varChild.var 是两个不同的变量,它们恰好发生在有相同的名字。您在任何意义上都没有“重写”派生类中的 var ;正如您自己发现的那样,这两个变量都可以彼此独立地访问。

最好的前进方式实际上取决于您想要实现的目标:

  1. 如果 Parent.varChild 不可见,请将其设为私有(private)
  2. 如果 Parent.varChild.var 是两个逻辑上不同的变量,请为它们指定不同的名称以避免混淆。
  3. 如果 Parent.varChild.var 在逻辑上是同一变量,则为它们使用一个数据成员。

关于java - 隐藏类的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com