一、概述
1、内部类有外部类的变量和方法的访问权。
2、使用内部类的一个重要原因是:
每个内部类都能独立的继承自一个类,所以无论外部类是否已经继承自某个类,对于内部类都没有影响。
二、成员内部类
1、没有被static修饰的内部类,可以用权限修饰符、abstract和final修饰。
2、创建内部类对象前需要先创建外部类的对象。new Outer().new Inner()。
3、在外部类中(包括内部类)生成外部类对象的引用。外部类名.this。
4、不能有static修饰的变量和方法。但是可以访问外部类的静态变量和静态方法。
Outer类:
public class Outer { public void a() { Outer.this.b(); System.out.println("Outer的a()方法"); } public void b() { System.out.println("Outer的b()方法"); } class inner { public Outer getOuter() { return Outer.this; } } }
Other类:
public class Other { public static void main(String[] args) { Outer.inner inner = new Outer().new inner(); inner.getOuter().a(); } }
三、静态内部类
1、成员内部类用static修饰后就变成静态内部类。
2、可以设置静态和非静态的变量和方法。
3、要创建静态内部类的对象,不需要先创建外部类的对象。
4、静态内部类和静态方法一样,在非静态变量和方法未初始化前就开始初始化,所以不能直接访问外部类的非静态变量和方法,需要先创建外部类的实例后再访问。
四、局部内部类
1、在方法(包括代码块、构造器)中定义的类称为局部内部类。局部内部类的使用范围在定义它的作用域中。所以只能在该作用域中实例化对象。
五、匿名内部类
1、没有名字的内部类。
2、需要继承类或实现接口。
Animal类:
public class Animal { void say(){}; }
Outer类:
public class Outer { public Animal getAnimal() { return new Animal() { @Override public void say() { System.out.println("猫说话"); } }; } }
通过new返回的引用被自动向上转型成Animal类的引用。简单的理解,一个类继承了Animal类,new出的这个类的实例向上转型成Animal类后再返回。
浙公网安备 33010602011771号