//看这个例子,这里的A类的构造方法是私有的(目的就是要不能new出A)class A {
//私有的构造方法
private A(){

}
}class MakeA {
public static void main(String[] args) {
new A();  //error!  //这里不可以new的原因我知道,因为A的构造方法是私有的,外部无法访问!
}
}-------------------------------------------------------------
//再看这个例子public class Parcel4 {
public Destination dest(String s) {
class PDestination implements Destination {
private String label; // 私有的构造方法
private PDestination(String whereTo) {
label = whereTo;
} public String readLabel() {
return label;
}
}
return new PDestination(s); // ?? PDestination类的构造方法是私有的,但这里为什么可以new出?
} public static void main(String[] args) {
Parcel4 p = new Parcel4();
Destination d = p.dest("Tanzania");
}
}
请问大家,第二个例子为什么可以在内部类的外部new出具有私有构造方法的内部类的一个对象???

解决方案 »

  1.   

    内部类、外部类之间的私有方法、变量彼此之间均可访问。第一个例子中的两个类之间不存在内部类关系,不能访问对方的私有属性注意缩进。
    public class Parcel4 {
    public Destination dest(String s) {
    class PDestination implements Destination {
    private String label;

    // 私有的构造方法
    private PDestination(String whereTo) {
    label = whereTo;
    }

    public String readLabel() {
    return label;
    }
    }
    return new PDestination(s); // ?? PDestination类的构造方法是私有的,但这里为什么可以new出?
    }

    public static void main(String[] args) {
    Parcel4 p = new Parcel4();
    Destination d = p.dest("Tanzania");
    }
    }
      

  2.   

    那请问这个为什么错误?
    public class X {
    class InnerClass {
    private InnerClass() { }
    } public static void main(String[] args) {
    new InnerClass();
    }
    }
      

  3.   

    静态方法中不能访问非静态方法或非静态内部类的方法
    public class Test {
        class InnerClass {
            private InnerClass() {        }
        }

    static class StaticInnerClass
    {
    private StaticInnerClass()
    {
    }
    }

        public static void main(String[] args) {
            //new InnerClass();
            Test t = new Test();
            t.new InnerClass();
            new StaticInnerClass();
        }
    }
      

  4.   

    兄台真是高手,拜君为“问不倒哥哥”,哈哈不过内部类的成员即便是private对于其外部类也是完全开放的吗?有没有什么特殊情况?
      

  5.   

    1. 内部类可以声明为private或protected,可以声明为static
    2. 内部类中可以直接访问外部类的方法。
    3. 内部类中可以直接访问外部类的数据成员
    4. 在外部类的静态方法中创建内部类对象,必须采用“外部类名.内部类名”的形式指定对象的类型,并且非静态内部类的对象必须通过外部类对象来创建。如:
    public static void f(){
    OuterClass out = new OuterClass();
    OuterClass.InnerClass in = out.new InnerClass();
    }
    5. 不能通过外部类对象访问内部类成员
    6. 不能通过内部类对象访问外部类成员
    7. 静态内部类对象可以直接采用“外部类名.内部类名”形式创建
     OuterClass.M m = new OuterClass.M();8. 私有内部类无法通过第4条创建
      

  6.   

    如果一个内部类的构造方法是private的,那么外围类是如何访问这个私有构造方法的呢?
    是通过构造方法重载实现的。
    举个例子:public class Outer{
        class Inner {
            private Inner() {        }
        }
    }编译后会生成两个文件,Outer.class 和 Outer$Inner.class。
    使用命令 javap -c -private Outer$Inner
    你会发现这个类其实有两个构造方法:
    private Outer$Inner(Outer);Outer$Inner(Outer, Outer$1);
    后者是编译器自动添加的,访问权限为package,参数比原来的多了一个Outer$1,但是这个参数不会被用到(在外围类调用时会被赋值为null),Outer类就是通过这个构造方法调用内部类的私有的构造方法的
      

  7.   

    只要是在外部类的{}内,都是可以访问的!okey?