内部阶级是外部阶级的一部分

时间:2019-01-08 23:20:27

标签: java inner-classes

让我们假设我有一家玩具店。我有一个网页可以买到这些玩具。每个玩具都有其自身的功能,但是代表一个人类玩具,我有一个名为HumanToy的类,具有一些高度,重量等属性。...但是我有一个嵌套的属性,它本身就是一个名为HumanLegs的JavaBean,并且该类具有其自身的功能,例如:

public class HumanToy{      

    private Double height;

    private Double weight;

    private HumanLegs humanLegs;

    private class HumanLegs{

        private Double height;

        private Double weight;

    }

我的问题是:

  1. 此玩具具有静态的HumanLegs类是否有意义?我的意思是,从概念上讲,HumanLegs不能单独存在,它们只能与玩具一起存在,因此我认为从逻辑上讲,这首先是一个内部类(而不是单独的类),其次出于相同的原因不是静态的,我的意思是,仅实例化HumanToy,您可以获取HumanLegs对象,或者要获取HumanLegs对象,则需要HumanToy对象。这是正确的想法吗?

谢谢

2 个答案:

答案 0 :(得分:3)

是的,这是有道理的,因为HumanLegs一直引用他的外部类。 如果将HumanLegs的实例移动到HumanToy的另一个实例,则原始HumanToy不会被删除,因为HumanLegs确实保留了对它的引用。

因此,外部类在内存中的保存时间至少与内部类的所有实例一样长。

答案 1 :(得分:0)

非静态成员类会导致性能下降,并使代码更难以理解。与其他编程语言功能一样,仅应在必要时使用它们。这意味着,如果您可以安排设计,而无需HumanLegs实例导航到HumanToy的相应封闭实例,那么最好将HumanLegs声明为静态成员类。

此直觉被有效Java(第三版)中的第24条捕获:

  

如果您声明不需要访问封闭实例的成员类,则总是static修饰符放在其声明中。

这与问题中提到的存在问题是分开的。通过将HumanLegs声明为私有,HumanToy的声明可以控制HumanLegs的实例不在HumanToy实例的上下文之外创建。