3

我知道,如果您将具有例如实例变量的类(超类)子类化,它将在子类中继承。

IE :

class Weather {
    int humidity;
}

public class Rainy extends Weather {
    void changeHumidity() {
        humidity = 10;
        System.out.println(super.humidity);
    }

    public static void main(String[] args) {
        new Rainy().changeHumidity();
    }
}

底线:我想知道为什么实例变量“湿度”在子类和类之间共享。

我知道如果我隐藏了它,它将不会被共享,但仍然为什么另一个实例(即使是超类)应该与继承逻辑中的子类共享一个变量。

提前致谢。

4

2 回答 2

8

Java 的创建者做出了两个决定来指导他们如何设计 Java。一是性能是重中之重,不能因为太慢而被判定为不可用。另一个决定是,他们将针对 C 和 C++ 开发人员,并使 Java 与他们习惯的相似,以便更容易采用。

因此,Java 像 C++ 一样获得了公共、私有和受保护的访问权限。package-private 出现在哪里以及为什么它是默认值尚不清楚。他们可能假设开发人员希望直接访问变量以节省方法调用开销。很久以前,我和 Marimba 的专业服务人员一起做一个项目,我们有机会研究了一些实现代码,这些代码是由很多包私有成员编写的。当我问为什么解释是为了表现时。这是在 JIT 之类的优化之前,因此可能有人担心使用访问器方法获取常用超类成员可能会太慢。另一方面,这可能是一种风格偏好,或者他们正在使用更自由的方法作为不断发展的设计的一部分,也许将 package-private 设置为默认值的想法是应该期待这种自由。(根据我读过的任何其他代码判断,这不是什么。)它是由 Jonathon Payne 和 Arthur Van Hoff 编写的代码,因此专业服务人员可能没有了解真正的原因。

詹姆斯·高斯林(James Gosling )在一次采访中谈到了他的原因

......我早期想做的一件事是正式设置并用语言获得一些东西。您知道在 JavaBeans 中如何编写 setter 和 getter 方法的这种约定吗?但当时我对开发人员进行了一系列调查,关于他们是否希望这个存在。一般人会说,“天哪!”

所以我没有这样做。但我想回想起来,我不应该听他们的。我应该做的。因为,我的意思是 Beans 基本上是在我本来想做的这个设施上分层的,但 Beans 是事后才做的。

而且因为它是作为命名约定分层的,所以有些东西不能很好地结合在一起。因此,例如,将实例变量的默认保护设为私有会很有意义。然后是 getter 和 setter,系统会在更深层次上知道它们,使它们要么公开要么打包。

风格演变的方向是更喜欢将实例变量设为私有,并在需要时通过 getter 公开它们。您可以指定私有访问修饰符,如下所示:

private int humidity;

然后变量对子类不可见。

于 2013-02-04T21:24:42.237 回答
3

我想知道为什么实例变量“湿度”在子类和类之间共享。

这就是默认/包本地成员所做的。

于 2013-02-04T21:21:37.467 回答