这几天学Java,遇到成员内部类的问题了。关于内部类访问外部类,网上已经有很多资料了,可是外部类以及外部类以外的类访问内部类的情况资料很少。今天我做了一个小实验,探究是否可以在外部类以外的类中执行创建内部类对象的语句。
一、外部类和内部类都为public,它们的构造方法也都为public
首先,我们写一个类OuterClass,再在它的内部创建一个类InnerClass。我们先将InnerClass设为public。代码如下:
public class OuterClass {
private int i;
public OuterClass(int i) {
this.i = i;
System.out.println("Outer Class created!");
}
public class InnerClass {
protected int j;
protected int k;
public InnerClass(int j, int k) {
this.j = j;
this.k = k;
System.out.println("Inner Class created!");
}
}
}
然后,我们写主程序:
public class Main {
public static void main(String[] args) {
OuterClass out = new OuterClass(1);
OuterClass.InnerClass in = out.new InnerClass(2,3);
}
}
在以上程序中,OuterClass是外部类,InnerClass是内部类,主方法main所在的Main类就是“外部类以外的类”。
运行以上程序,我们发现程序可以成功运行,且结果如下:
Outer Class created!
Inner Class created!
如果我们将主程序修改成下面的样子:
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass in = new OuterClass.InnerClass(2,3);
}
}
那么运行会报错:an enclosing instance that contains OuterClass.InnerClass is required
这说明,在外部类和内部类及它们的构造方法都为public时,可以在外部类以外的类(Main类)中执行创建内部类(InnerClass类)对象的语句,语法如下:
外部类.内部类 内部类对象名 = 外部类对象名.new 内部类(内部类构造方法参数列表)
但是,这样做的前提是:要先创建外部类对象。创建了外部类的对象,才能在其基础上创建内部类对象。
二、外部类为public,内部类为private,它们的构造方法都为public
我们将InnerClass的访问修饰符改为private,修改后的代码如下:
public class OuterClass {
private int i;
public OuterClass(int i) {
this.i = i;
System.out.println("Outer Class created!");
}
private class InnerClass {
protected int j;
protected int k;
public InnerClass(int j, int k) {
this.j = j;
this.k = k;
System.out.println("Inner Class created!");
}
}
}
主程序代码如下:
public class Main {
public static void main(String[] args) {
OuterClass out = new OuterClass(1);
OuterClass.InnerClass in = out.new InnerClass(2,3);
}
}
尝试运行程序,会报错:OuterClass.InnerClass has private access in OuterClass
所以,如果内部类为private,则不能从外部类以外的类创建内部类的对象。
三、外部类和内部类都为public,外部类的构造方法为public,内部类的构造方法为private
外部类和内部类的代码:
public class OuterClass {
private int i;
public OuterClass(int i) {
this.i = i;
System.out.println("Outer Class created!");
}
public class InnerClass {
protected int j;
protected int k;
private InnerClass(int j, int k) {
this.j = j;
this.k = k;
System.out.println("Inner Class created!");
}
}
}
主程序代码:
public class Main {
public static void main(String[] args) {
OuterClass out = new OuterClass(1);
OuterClass.InnerClass in = out.new InnerClass(2,3);
}
}
运行程序,会报InnerClass(int,int) has private access in OuterClass.InnerClass的错误。
所以,如果内部类的构造方法为private,就不能从外部类以外的类创建内部类的对象。