外部类可以访问内部类私有构造函数?
public class Test {
public static class TypeDescriptor {
private TypeDescriptor() {
System.out.println("aaaaaaaaaaaa");
}
private void fff(){
System.out.println("bbbbbbbbbbbb");
}
}
public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
public static void main(String[] args){
BOOLEAN.fff();
}
}
public class Test {
public static class TypeDescriptor {
private TypeDescriptor() {
System.out.println("aaaaaaaaaaaa");
}
private void fff(){
System.out.println("bbbbbbbbbbbb");
}
}
public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
public static void main(String[] args){
BOOLEAN.fff();
}
}
public static final TypeDescriptor BOOLEAN = new TypeDescriptor(); 不用这样new Test.TypeDescriptor().fff();
不是定义为private么,
说实话,这是一种破坏规则的方法,不过还是有办法可以做到,就是reflect。
利用反射机制可以取到类的私有方法和构造函数,然后将其改为public的就可以使用了,当然还是通过反射的方法。
这也就是为什么我们实现单例时最好的实现是在把构造函数私有化的同时,再在这个函数里抛出一个异常的原因了。这才可能保证没有人可以破坏规则。
不过这种方法,在做测试的时候特别有用,如是想使用JUnit测试私有方法,这个就是一种很不错的途径,在不进入类内部的情况下测试私有成员和函数。
老师是这么说的
至于reflection的话...最近才知道还有这个东西的.....还在测试这个东西怎么用的,NO COMMENT
既然在外部声明了静态成员方法 当然可以调用私有的fff方法了
不知道解释的明不明白。
楼主可以看看单台设计模式的介绍 自己领会下
public static class TypeDescriptor { //静态内部类,不能访问外部类成员的,跟外部类只是名称空间上的关联
private TypeDescriptor() { //私有构造方法,只能在TypeDescriptor 类中实例化自己,别的地方就不能实例化了
System.out.println("aaaaaaaaaaaa");
}
private void fff(){
System.out.println("bbbbbbbbbbbb");
}
}
public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
public static void main(String[] args){
BOOLEAN.fff();
}
}
外部类.内部类 name = 外部类的对象.new 内部类();
如下所示:
public class Out {
class Inner {
private String s;
private Inner(String s) {
this.s = s;
}
public void pin() {
System.out.println(s);
}
}
public static void main(String[] args) {
Out out = new Out();
Out.Inner in = out.new Inner("hello, world");
}
}
不过还有以下疑问:
TO hmsuccess
这就是内部类的好处了,它可以访问外部类,内部类就相当于外部类的属性方法,既然是外部类的属性,
他当然就能访问所属的类的其他任何方法。
这样的话,将构造子定义为私有,是什么用意啊 TO AnnaFlying
Out.Inner in = out.new Inner("hello, world");
这么说是把原例中的
public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
原型应为
public static final TypeDescriptor BOOLEAN = new Test.TypeDescriptor();
了