一、内部类概述
在一个类的内部定义一个类。在 A 类中定义 类 B。B 类就被叫做 A 的内部类。A 类就是 B 的外部类。
二、内部类的种类
内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类。
1、成员内部类
(1)定义
在一个类中定义一个类,这个类相当于另一个类的成员。
成员内部类中不可以有静态成员和静态方法。
public class Outer { private String name; public void out() { System.out.println("这是外部类的方法"); } class Inner { public void in() { System.out.println("这是内部类的方法"); } }}
(2)实例化
实例化成员内部类需要先初始化外部类,然后用外部类调用内部类,最后用外部类的实例实例化内部类。
// 1. 实例化外部类 Outer outObj = new Outer(); // 2. 用外部类调用内部类,用外部类的实例实例化内部类 Outer.Inner inner = outObj.new Inner(); // 3. 测试:调用内部类的方法 inner.in();
(3)成员内部类可以干什么
访问外部类的所有属性和方法。
public class Outer { private String name; public void out() { System.out.println("这是外部类的方法"); } class Inner { public void in() { System.out.println("这是内部类的方法"); // 访问外部类属性 System.out.println(name); // 访问外部类方法 out(); } }}
2、静态内部类
(1)定义
使用 static 修饰的内部类就是静态内部类。
(2)实例化
如何实例化静态内部类:使用外部类调用静态内部类就可以实例化静态内部类。
public static void main(String[] args) { // 创建静态内部类对象 Outer.Inner inner = new Outer.Inner(); inner.in(); }
(3)静态内部类可以干什么
- 静态内部类不可以使用外部类非静态的成员和非静态的方法。
- 静态内部类中可以声明静态成员和方法。
3、局部内部类
(1)定义
在一个方法中声明一个类,就是局部内部类。
public class Outer1 { private String name; public void out() { System.out.println("这是外部类"); } public void method1() { // 局部内部类 class Inner { public void in() { System.out.println("这是局部内部类"); // 局部内部类可以访问外部类的属性和方法 System.out.println(name); out(); } } }}
(2)实例化
局部内部类不能用外部类调用实例化,只能在局部内部类定义的方法中实例化。
public class Outer1 { private String name; public void out() { System.out.println("这是外部类"); } public void method1() { // 局部内部类 class Inner { public void in() { System.out.println("这是局部内部类"); } } // 实例化局部内部类 Inner in = new Inner(); in.in(); }}
4、匿名内部类
(1)定义
匿名内部类是最常用的内部类。
匿名内部类主要依赖于其他类和接口来实现。
依赖类:这个匿名内部类默认是该类的子类。
依赖接口:这个匿名内部类默认是该接口的实现。
(2)使用匿名内部类
接口 Work
public interface Work { void doWork();}
用匿名内部类实现接口,并调用方法:
public static void main(String[] args) { // 创建一个匿名内部类 new Work() { @Override public void doWork() { System.out.println("doWork"); } }.doWork(); }
不使用匿名内部类,实现接口,并调用方法:
实现接口:
public class WorkImpl implements Work { @Override public void doWork() { System.out.println("doWork"); }}
调用方法:
public static void main(String[] args) { new WorkImpl().doWork(); }