public class InnerClassDemo {
static class A{}
class B{}
public static void main(String[] args){
class C{}
//A
InnerClassDemo.A a=new InnerClassDemo.A();
//B
InnerClassDemo.B b=new InnerClassDemo().new B();
//C
C c=new C();
//D
Runnable d=new Runnable(){
public void run(){
}
};
}
class C{};
}
class C{};上面虽然只十几行代码,却包含了7各类的定义,而且基本包括了所有匿名类的情况。
可以看到其中有三个类名字为C,匿名类是没有名字的。
static class A{}
class B{}
public static void main(String[] args){
class C{}
//A
InnerClassDemo.A a=new InnerClassDemo.A();
//B
InnerClassDemo.B b=new InnerClassDemo().new B();
//C
C c=new C();
//D
Runnable d=new Runnable(){
public void run(){
}
};
}
class C{};
}
class C{};上面虽然只十几行代码,却包含了7各类的定义,而且基本包括了所有匿名类的情况。
可以看到其中有三个类名字为C,匿名类是没有名字的。
InnerClassDemo.class
InnerClassDemo$A.class
InnerClassDemo$B.class
InnerClassDemo$1$C.class
InnerClassDemo$1.class
InnerClassDemo$C.class
C.class其中第一个和最后一个为一般类,其他五个为内部类,可以分为4类。
第一种为静态内部类,这是最为特殊的一种,具有一般类的特性,使用起来基本上没有多大的区别,例如:
Point2D float=new Point2D.Float();
Point2D double=new Point2D.Double();
不过多了类限制符号,我们知道 Float和Double是Point2D的两个静态内部类,而且是public的。
其它使用就没有区别了。
这种类的优点是可以很容易隐藏,如果修师符号为private,就完全隐藏了,可以认为就是一个内部自定义类型。
一般内部类具有对外部类的一个引用,所有必须有外部类的实例来创建,这是一个很怪异的语法。
InnerClassDemo.B b=new InnerClassDemo().new B();我们可以这样理解:
内部类相定义为
class InnerClassDemo$B{
InnerClassDemo$B outer;
InnerClassDemo$B(InnerClassDemo outer){
this.outer=outer;
}
}
上面的:InnerClassDemo.B b=new InnerClassDemo().new B();
我们改为:
InnerClassDemo outer=new InnerClassDemo();
InnerClassDemo$B inner=new InnerClassDemo$B(outer);
似乎是一样的意思。
我们可以把内部类代码转换为非内部类代码,不过内部类一个重要的优点就是简化代码。
特别是在swing中用的比较多
启动一个线程
new Thread(){
public void run(){
//doing something
}
}.start();
排序
Collections.sort(list,new Comparator(){
public int compare(Object o1,Object o2){ return 0;}
});这种类都是使用一次就不再使用的情况。
把上面的匿名类变为临时类
class MyThread extends Thread{
public void run(){
//doing something
}
}
new MyThread().start();class MyComparator implements Comparator{
public int compare(Object o1,Object o2){ return 0;}
}
Collections.sort(list,new MyComparator());
Collections.sort(list2,new MyComparator());//在方法体内可以重复使用
这里不考虑静态内部类,因为没有什么特别的限制
1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
2.内部类可以直接访问外围类的方法。
3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。我像这样做是为了
规范内部类的行为。