内部类
1. 基本使用
①: 概念
- 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类;
② 格式
/*
class 外部类名{
修饰符 class 内部类名{
}
}
*/
class Outer {
public class Inner {
}
}
③ 访问特点
- 内部类可以直接访问外部类的成员,包括私有;
- 外部类要访问内部类的成员,必须创建对象;
public class Outer {
private int num = 10;
public class Inner {
public void show() {
System.out.println(num);
}
}
public void method() {
Inner i = new Inner();
i.show();
}
}
2. 成员内部类
① 定义位置
- 在类中方法外,跟成员变量是一个位置
class Outer {
private int num = 10;
private class Inner {
public void show() {
System.out.println(num);
}
}
}
② 使用方式
- 将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。
class Outer {
private int num = 10;
private class Inner {
public void show() {
System.out.println(num);
}
}
public void method() {
Inner i = new Inner();
i.show();
}
}
public class InnerDemo {
public static void main(String[] args) {
//Outer.Inner oi = new Outer().new Inner();
//oi.show();
Outer o = new Outer();
o.method();
}
}
3. 局部内部类
① 定义位置
- 局部内部类是在方法中定义的类;
class Outer {
private int num = 10;
public void method() {
int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
System.out.println(num2);
}
}
}
}
② 使用方式
- 局部内部类,外界是无法直接使用,需要在方法内部创建对象并使用;
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量;
class Outer {
private int num = 10;
public void method() {
int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
System.out.println(num2);
}
}
Inner i = new Inner();
i.show();
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
4. 匿名内部类
① 定义匿名内部类的前提
- 存在一个类或者接口,这里的类可以是具体类也可以是抽象类;
② 格式
- new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
new Inter(){
@Override
public void method(){}
}
③ 本质
- 匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象
④ 使用方式
- 通过多态的形式接受
Inter i = new Inter(){
@Override
public void method(){
}
}
- 直接调用方法
interface Inter{
void method();
}
class Test{
public static void main(String[] args){
new Inter(){
@Override
public void method(){
System.out.println("我是匿名内部类");
}
}.method(); // 直接调用方法
}
}
⑤ 练习
public class Test {
public static void main(String[] args) {
// 创建字符串集合
ArrayList<String> names = new ArrayList<>();
// 添加元素
names.add("Tom");
names.add("Jack");
names.add("Sara");
names.add("Rose");
// 集合中的元素按照首字母排序
// sort 方法需要一个Comparator的对象, 但是Comparator是接口, 不能实例化,
// 因此这里使用匿名内部类来创建Comparator对象
names.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int res = o1.compareTo(o2);
return res;
}
});
// 输出集合
System.out.println(names);
}
}
运行结果: