目录
概述
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
在JAVA中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
分类
- 成员内部类: 静态 vs 非静态
- 局部内部类: 构造器内、代码块内、方法内
成员内部类
作为外部类的成员:
可以调用外部类的结构
可以被static修饰
可以被4种不同权限修饰
作为一个类:
可以定义属性、方法、构造器
可以被final修饰
可以被abstract修饰
局部内部类
可以存在于构造器内、代码块内、方法内。
class Person {
// 构造器内-局部内部类
public Person() {
class AA {
}
}
// 代码块内-局部内部类
{
class BB {
}
}
// 方法内-局部内部类
public void method() {
class CC {
}
}
}
问题1:如何实例化成员内部类的对象
问题2:如何在成员内部类中调用外部类的结构
public class InnerclassTest {
public static void main(String[] args) {
// 创建Dog实例(静态成员内部类)
Person.Dog dog = new Person.Dog();
dog.show();
// 创建Bird实例(非静态成员内部类)
Person p = new Person();
Person.Bird bird = p.new Bird();
bird.Sing();
// 调用内部类方法
bird.display("黄鹂");
}
}
class Person {
String name = "小明";
int age;
public void eat() {
System.out.println("人,吃饭");
}
// 静态成员内部类
static class Dog {
String name;
int age;
public void show() {
System.out.println("卡拉是条狗");
}
}
// 非静态成员内部类
class Bird {
String name = "杜鹃";
public void Sing() {
System.out.println("小鸟在唱歌");
Person.this.eat();// 调用外部类的非静态属性
}
public void display(String name) {
// 方法的形参
System.out.println(name);
// 内部类Bird的属性
System.out.println(this.name);
// 外部类Person的属性
System.out.println(Person.this.name);
}
}
}
问题3:实际开发中局部内部类的使用
创建一个方法,方法返回指定接口的实现类的对象
方式一:接口有名实现类的匿名对象
方式二:接口匿名实现类的匿名对象
public class InnerclassTest {
// 方法返回一个Comparable接口的实现类的对象
public Comparable getComparable() {
// 方式一: 接口有名实现类的匿名对象
class MyComparable implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();
}
public Comparable getComparable2() {
// 方式二: 接口的匿名实现类的匿名对象
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}