内部类:
把类A定义在类B的内部,类A就被称为内部类。

访问特点:
A:内部类可以直接访问外部类的成员,包括私有。
B:外部类要访问内部类的成员,必须创建对象。

内部类分类:
成员位置:成员内部类
局部位置:局部内部类

成员内部类:
外界如何创建对象

外部类名.内部类名 对象名 = 外部类对象.内部类对象;

示例:

 1 class Outer3{
 2     //创建一个成员内部类
 3     class Inner3{
 4         public void show(){
 5             System.out.println("inner3的show()");    
 6         }
 7     }
 8     
 9 }
10 
11 public class InnerClassDemo3 {
12     public static void main(String[] args) {
13         //需求:创建上面的内部类对象,调用他的show方法
14         //创建内部类对象的格式:外部类名.内部类名     对象名 = 外部类对象.内部类对象
15         Outer3.Inner3 oi = new Outer3().new Inner3(); 
16         oi.show();
17     }
18 
19 }

 

局部内部类:
A:可以直接访问外部类的成员,包括私有
B:在成员方法中创建局部内部类的对象,调用局部内部类的功能

示例:

 1 class Outer{
 2     //创建一个外部类的私有化的成员变量
 3     private int num = 30;
 4     
 5     //创建一个show方法,show方法内部有一个局部内部类
 6     public void show(){
 7         //设置一个show方法的局部变量
 8         final int num2 = 40;//num2被加上final之后,num2变成了常量,其实本质上他就是40
 9         //创建局部内部类
10         class Inner{
11             //存在一个function方法
12             public void function(){
13                 System.out.println(num2);
14                 //System.out.println(40);
15                 //编译:java -- class
16                 //反编译:class -- java
17                 /**
18                  * 问题:局部内部类的成员方法访问局部变量的时候,局部变量为什么必须加上final就不报错了呢??
19                  * 我们的show方法在调用的时候存在于栈内存,当show方法调用完毕之后,他的局部变量num2会随着show
20                  * 方法调用完毕二消失,但是现在存在一个问题,show方法中的局部对象不会立即从堆内存中直接释放掉,他还保留着num2,
21                  * 此时就发生了矛盾,局部对象想使用这个num2这个变量,但是他又急着从栈内存中消失。。。,所以我们需要给num2加上final关键字
22                  * 是他变为常量
23                  */
24             }
25         }
26         
27         //需求:在show方法中调用局部内部类的function方法
28         //创建局部内部类对象
29         Inner i = new Inner();
30         i.function();
31     }
32     
33 }
34 
35 
36 public class InnerClassDemo {
37     public static void main(String[] args) {
38         //需求:调用Outer外部类的show方法
39         //创建外部类对象
40         Outer o = new Outer();
41         o.show();
42     }
43 
44 }

 

匿名内部类
没有名字的局部内部类,就是内部类的简化写法

前提:
存在一个类或者接口
这里的类可以是具体类也可以是抽象类。

格式:
new 类名或者接口名() {
重写方法;
};

本质:
是一个继承了类或者实现了接口的子类匿名对象。

示例:

 1 interface Animal{
 2     public abstract void eat();
 3 }
 4 
 5 //创建一个外部类
 6 class Outer2{
 7     //创建一个show方法,方法中存在一个匿名内部类
 8     public void show(){
 9         //匿名内部类
10         //匿名内部类格式:new 类或者接口(){重写的方法}
11         //匿名内部类本质:就是一个继承了类 ,或者实现了接口 ,的子类或者实现类的匿名对象
12         new Animal(){
13             public void eat() {
14                 System.out.println("动物爱吃肉");
15             }    
16         }.eat();
17     }
18 }
19 
20 
21 public class InnerClassDemo2 {
22     public static void main(String[] args) {
23         //创建一个Outer2这个外部类对象
24         Outer2 o2 = new Outer2();
25         o2.show();
26     }
27 
28 }

 

posted on 2017-04-19 10:54  少放辣子  阅读(135)  评论(0编辑  收藏  举报