Java 私有嵌套/内部类的用途是什么?
我的印象是私有的内部/嵌套类只用于/由/由外部类访问。但是在实验中,我意识到HashSet(它不是Happy的外部类)可以访问这个类。如果是这样的话,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; }
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