内部类:
把类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 }