一、内部类概述
在一个类的内部定义一个类。在 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();}