在类的成员中,有变量(variable,有的称之为属性,property)和方法(method,有的称之为函数,function)。现在,又添了一个类(class)。这是个很有意思的成员。
静态内部类又称为“嵌套类(nested class)”。因为只属于外部类,静态内部类不依赖于外部类所生成的对象,所以还不算奇怪。在外部类之内的方法中创建内部类对象就和创建一般对象一样没有区别。而在外部类之外创建内部类对象时,要明确内部类的位置:外部类类名.内部类类名 引用=new 外部类类名.内部类构造器; ,这使外部类看起来很像包。
而非静态内部类就很奇怪了。因为在有权限的情况下,类成员变量和方法在类生成的对象中是可以访问的,于是我们可以认为这些成员随类被具体化了。而类是抽象的,在外部类生成的具体对象中肯定不能访问到成员内部类,并且在外部类具体化的同时内部类是不会被具体化的。然后你可能会想到直接通过类名来利用内部类,就和静态内部类一样。那么,就请注意这个非静态内部类和其他非静态成员一样是依赖于对象的,而不是类(可别犯概念错误!)。再说,如果这样,静态和非静态还有什么差别啊?可是类的非静态成员内部类到底哪里去了(要知道,它也可以用public来修饰啊)?类和对象看似水火不容,而Java偏偏就是把它们结合在了一起。既然结合了,就必然有办法在外部类外或通过外部类对象来利用非静态成员内部类(在外部类中创建它的对象,与普通类没啥区别,不谈了)。创建它的对象的方法以前从来没有见过:
外部类类名.内部类类名 引用=new 外部类构造器.new
内部类构造器;
或
外部类类名.内部类类名 引用=外部类对象引用.new 内部类构造器;
我们不能直接在外部类对象中访问到非静态内部类的构造器,但能通过new运算符访问到(这种用法很怪)。还要注意的是,在静态方法中不能创建非静态内部类的对象。
在编译后,内部类会有自己专有的class文件,其命名方式是:外部类名称$内部类名称.class。
另外,我还做了一些试验:
1.在成员内部类中可以访问到其外部类的其他数据成员
2.内部类可继承或实现接口
3.内部类还可以拥有内部类
4.存在内部接口,只能出现在最外部类中或静态内部类中
5.非静态内部类不能拥有静态成员,静态内部类中可以拥有静态成员(内部接口也算静态成员)
附:试验代码
class MyAttempt1
{
private int i=12;
interface gg{public void p();}
static int hh(){return 0;}
public class aa implements gg
{
public void p()
{
ee ff=new ee();
ff.p();
}
public class ee implements gg
{
public void p()
{
System.out.println(i);
}
}
//interface gg{public void p();} 出错,提示说“内部类成员不能有静态声明”
//static int hh(){return 0;} 出错,提示说“内部类成员不能有静态声明”
}
public static void main(String[] args)
{
MyAttempt1 dd=new MyAttempt1();
dd.bb();
}
private void bb()
{
aa cc=new aa();
cc.p();
}
}
class MyAttempt2
{
private int i=12;
//public static class aa implements gg 出错,提示说“找不到符号”
public static class aa
{
public void p()
{
ee ff=new ee();
ff.p();
}
public class ee implements gg
{
public void p()
{
//System.out.println(i); 出错,提示说“无法从静态上下文中引用非静态变量i”
System.out.println(hh());
}
}
interface gg{public void p();}
static int hh(){return 0;}
}
public static void main(String[] args)
{
MyAttempt2 dd=new MyAttempt2();
dd.bb();
}
private void bb()
{
aa cc=new aa();
cc.p();
}
}