使用Java继承实例变量

时间:2013-02-04 21:20:07

标签: java inheritance

我知道如果你继承了一个类(超类),例如一个实例变量,它将继承在子类中。

即。 :

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();
    }
}

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

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

提前致谢。

2 个答案:

答案 0 :(得分:8)

Java的创建者有两个决定指导他们如何设计Java。其中一个原因是性能是优先考虑因素,因此太慢而不能判断它是不可用的。另一个决定是他们将针对C和C ++开发人员,并使Java与他们习惯使用的类似,以便更容易采用。

因此,Java获得了像C ++这样的公共,私有和受保护的访问。 package-private进来的地方以及为什么默认不明确。他们可能假设开发人员希望直接访问变量以节省方法调用开销。很久以前,我正在与Marimba的专业服务人员合作开展一个项目,我们有机会调查一些实施代码,这些代码是用很多包私有成员编写的。当我问为什么解释是为了表现。这是在像JIT这样的优化之前,因此可能存在一个问题,即使用访问器方法来获取常用的超类成员可能会太慢。另一方面,它可能是一种风格偏好,或者他们使用更自由的方法作为不断发展的设计的一部分,也许将默认包装私有的想法是应该预期这种自由。 (这不是因为我读过的任何其他代码判断的结果。)这是Jonathon Payne和Arthur Van Hoff编写的代码,所以专业服务人员可能没有真正理由。

an interview where James Gosling talks about his reasons

  

...我之前想要做的事情之一就是正式设置和获取语言内容。您知道JavaBeans中有哪种类型的约定可以编写setter和getter方法吗?但我当时做了一堆关于开发人员的调查,关于他们是否愿意这样做。一般人都说:“天啊!”

     

所以我没有这样做。但我想回想起来,我永远不应该听取他们的意见。我应该做的。因为,我的意思是Beans基本上都是我想要做的设施上的分层,但Beans认为这是事后的想法。

     

并且因为它作为命名约定分层,所以有些东西不能很好地融合在一起。因此,例如,对于实例变量的默认保护是私有的,这将是非常有意义的。然后是系统在更深层次上已经知道的吸气剂和固定剂,使它们成为公共或包装。

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

private int humidity;

然后该变量对子类不可见。

答案 1 :(得分:3)

  

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

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