0

我的印象是私有内部/嵌套类仅用于外部类/由外部类使用/访问。但是通过实验我意识到HashSet(不是Happy的外部类)可以访问该类。如果是这样,那么真正的用途是private什么?它是否仅将类的创建限制在外部类中?

public class FreeMain {

    private static class Happy {
       int x; 
       private Happy(int x) {
           this.x = x;
       }

       @Override
       public boolean equals(Object o) {
           return true;
       }

       @Override
       public int hashCode() {
           return 10;
       }
    }

    public static void main(String[] args) {
        Set<Happy> happiness = new HashSet<Happy>();

        Happy h1 = new Happy(10);
        Happy h2 = new Happy(20);

        happiness.add(h1);
        happiness.add(h2);
    }   
}
4

2 回答 2

3

Java 中的访问修饰符控制标识符可以合法访问或引用的范围。您正在使用私有嵌套(静态 => 嵌套,非静态 => 内部)类作为 a 的类型参数,HashSet但引用仍在父类的范围内。

如果是这样,那么 Private 的真正用途是什么?它是否仅将类的创建限制在外部类中?

不,它不仅限制了创作。你甚至不能引用类Happy外的FreeMain类型。如果您尝试使用 type 声明某些内容Happy,或在 class 之外Happy用作类型参数(如Set<Happy>FreeMain,您将收到编译器错误。


总而言之,如果对私有嵌套类的引用被传递给另一个类(如 set),只要它在 freemain 范围内,它就可以工作。

是的,这基本上是正确的。然而,Set当你声明一个Set<Happy>. 类中的任何代码Set都看不到您在参数中提供的实际类型(由于类型擦除)。Java 编译器只是使用您在类型参数中指定的信息作为一种类型断言来检查您的程序的正确性。

当您声明时,包含实例Set<Happy> happiness的事实在任何地方都不为人所知,但在. 因此,该类型实际上从未在您的类范围之外使用,这就是为什么它是合法的,即使它是私有的。happinessHappyhappinessHappyFreeMainHappy

于 2013-10-23T04:01:12.087 回答
3

使用嵌套类的令人信服的原因包括:

这是一种对仅在一个地方使用的类进行逻辑分组的方法:如果一个类仅对另一个类有用,那么将其嵌入该类并将两者放在一起是合乎逻辑的。嵌套这样的“帮助类”使它们的包更加精简。

它增加了封装性:考虑两个顶级类 A 和 B,其中 B 需要访问 A 的成员,否则这些成员将被声明为私有。通过将类 B 隐藏在类 A 中,可以将 A 的成员声明为私有的,并且 B 可以访问它们。此外,B 本身可以对外界隐藏。

它可以导致代码更易读和更可维护:在顶级类中嵌套小类可以使代码更接近使用它的位置。

于 2013-10-23T03:57:55.107 回答