内部类定义

可以将一个类的定义放在另一个类的定义内部,这就是内部类

内部类的共性

  • 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
  • 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的
  • 内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量

内部类分类

内部类可以分为以下4种情况,成员内部类、静态嵌套类、方法内部类、匿名内部类

成员内部类(非静态内部类)

1
2
3
4
5
6
7
8
9
10
11
12
class Outer{
class Inner{
}
}
class Test {
public static void main(String[] args){
Outer outer = new Outer();
outer.Inner n = new outer.Inner();
}
}

从上面的例子代码可以看出,创建非静态内部类对象时,一定要先创建起相应的外部类对象 这样造成的结果就是非静态内部类实例会持有外部类对象的引用,
这样,内部类就可以访问外部类所有内容,包括私有变量,这个特性是非静态内部类的最大特征;

方法内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
class Outer{
public void outerMethod(){
class Inner{
public void innerMethod(){
}
}
}
}
  • 方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化
  • 方法内部类对象不能使用该内部类所在方法的非final局部变量

    因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!
    所以,如果内部类中任然要访问调用方法中的变量的话,该变量只能声明为final常量,这样堆就可以访问常量区的内容了,这个特性是方法内部类的最大特征;

    静态嵌套类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Outer{
    static class Inner{}
    }
    class Test {
    public static void main(String[] args){
    Outer.Inner n = new Outer.Inner();
    }
    }

从上面的例子代码可以看出,创建非静态内部类对象时,不需要创建起相应的外部类对象
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法,这个特性是静态嵌套类的最大特征;

匿名内部类

没有名字的内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Bird {
protected void fly(){
System.out.println("fly 100M high");
}
}
public class Animal {
public void chickenFly(){
Bird bird = new Bird(){
@Override
protected void fly() {
System.out.println("fly 1M high");
}
};
bird.fly();
}
}

刚开始对这个没有名字很难理解,上面的例子中分明是有个名字类名Bird吗?非也非也,此时的Bird已经不是那个能飞100米的鸟了,而是一个只能飞1米的类‘鸡’了,
Bird bird 不是指向Bird的实例,而是指向一个继承了Bird类的子类的实例,这个类是没有名字,所以是匿名类;

匿名内部类只有通过继承类或实现接口的方式实现,这个特性是匿名内部类的最大特征;

平时我们用的最多的匿名内部类就是:Thread类,和Runnabe接口

1
2
3
4
5
6
new Thread(){
public void run(){
}
}.start;

1
2
3
4
5
6
new Thread(new Runnable(){
public void run(){
}
}).start;

为什么要用内部类

在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。
可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整

参考

http://blog.sina.com.cn/s/blog_77c6324101016hgm.html
http://baike.baidu.com/link?url=evoroxTdcmlUIMEPGrXHjYEFqy0P7tQx7YTZW48rVNd5XozxFaf9nuPnEAqL0jN7GsAixcOG7F6SxpDPbAxP9RK0-zwI7MA1AV4wSi-VOYuPw_CxzGiolZxTof26Lcyq