//看这个例子,这里的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出具有私有构造方法的内部类的一个对象???
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");
}
}
public class X {
class InnerClass {
private InnerClass() { }
} public static void main(String[] args) {
new InnerClass();
}
}
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();
}
}
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条创建
是通过构造方法重载实现的。
举个例子: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类就是通过这个构造方法调用内部类的私有的构造方法的