Java 私有嵌套/内部类的用途是什么?

Java 私有嵌套/内部类的用途是什么?,java,class,private,Java,Class,Private,我的印象是私有的内部/嵌套类只用于/由/由外部类访问。但是在实验中,我意识到HashSet(它不是Happy的外部类)可以访问这个类。如果是这样的话,private的真正用途是什么?它只是将类的创建限制在外部类中吗 public class FreeMain { private static class Happy { int x; private Happy(int x) { this.x = x; }

我的印象是私有的内部/嵌套类只用于/由/由外部类访问。但是在实验中,我意识到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);
    }   
}
公共类FreeMain{
私人静班快乐{
int x;
二等兵快乐(int x){
这个.x=x;
}
@凌驾
公共布尔等于(对象o){
返回true;
}
@凌驾
公共int hashCode(){
返回10;
}
}
公共静态void main(字符串[]args){
Set happiness=newhashset();
快乐h1=新快乐(10);
快乐h2=新快乐(20);
幸福。加上(h1);
幸福。加(h2);
}   
}

使用嵌套类的主要原因包括:

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

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


它可以产生更可读和可维护的代码:在顶级类中嵌套小型类会使代码更接近使用它的位置。

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

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

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

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

控制合法访问或引用标识符的范围。您正在使用您的私有嵌套(static=>nested,non-static=>internal)类作为
HashSet
的类型参数,但是引用仍然发生在父类的范围内

如果是这样的话,那么私人空间的真正用途是什么?它只是将类的创建限制在外部类中吗

不,这不仅仅是限制创作。您甚至不能在
FreeMain
类之外引用类型
Happy
。如果您试图在类
FreeMain
之外声明类型为
Happy
的内容,或使用
Happy
作为类型参数(如
Set
),则会出现编译器错误



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

是的,基本正确。但是,当您声明一个
Set
时,类型并没有真正“传递”到
Set
集合
类中的任何代码都看不到您在参数中提供的实际类型(由于)。Java编译器只是使用您在类型参数中指定的信息作为一种类型断言来检查程序的正确性

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

控制合法访问或引用标识符的范围。您正在使用您的私有嵌套(static=>nested,non-static=>internal)类作为
HashSet
的类型参数,但是引用仍然发生在父类的范围内

如果是这样的话,那么私人空间的真正用途是什么?它只是将类的创建限制在外部类中吗

不,这不仅仅是限制创作。您甚至不能在
FreeMain
类之外引用类型
Happy
。如果您试图在类
FreeMain
之外声明类型为
Happy
的内容,或使用
Happy
作为类型参数(如
Set
),则会出现编译器错误



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

是的,基本正确。但是,当您声明一个
Set
时,类型并没有真正“传递”到
Set
集合
类中的任何代码都看不到您在参数中提供的实际类型(由于)。Java编译器只是使用您在类型参数中指定的信息作为一种类型断言来检查程序的正确性


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

已经有一段时间了,但是类HashSet将无法进入FreeMain a