目录
01 概述
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
在 Java 中,允许一个类的定义位于另一个类的内部,前者称为 内部类 ,后者称为 外部类 。
02 成员内部类
- 成员内部类
- 局部内部类(方法内、代码块内、构造器内)
- 3.成员内部类
* 》作为外部类的成员,
* - 调用外部类的结构
* - 可以被static修饰
* - 可以被4种不同的权限修饰
*
* 》作为一个类,
* - 类内可以定义属性、方法、构造器等
* - 可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
* - 可以abstract修饰
*
* 4.关注如下的3个问题
* 》 如何实例化成员内部类的对象- 静态内部
-
Person.Dog dog = new Person.Dog(); dog.show();
- 动态内部类
-
// Person.Bird bird = new Person.Bird(); Person p = new Person(); // 先实例化出对象,才能新建内部类 Person.Bird bird = p.new Bird(); bird.sing();
* 》 如何在成员内部类中区分调用外部类的结构
-
public void display(String name){ System.out.println(name); //方法的形参 System.out.println(this.name); //内部类的属性 System.out.println(Person.this.name); //外部类的属性 }
* 》 开发中局部内部类的使用 见《InnerClassTest1.java》
public class InnerClassTest {
public static void main(String[] args) {
//创建Dog实例(静态的成员内部类)
Person.Dog dog = new Person.Dog();
dog.show();
//创建Bird实例(非静态的成员内部类)
// Person.Bird bird = new Person.Bird();
Person p = new Person();
Person.Bird bird = p.new Bird();
bird.sing();
System.out.println();
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("卡拉是条狗");
// eat();
}
}
//非静态成员内部类
class Bird{
String name = "杜鹃";
public Bird(){
}
public void sing(){
System.out.println("我是一只猫头鹰");
Person.this.eat();//调用外部类的非静态属性
eat();
System.out.println(age);
}
public void display(String name){
System.out.println(name); //方法的形参
System.out.println(this.name); //内部类的属性
System.out.println(Person.this.name); //外部类的属性
}
}
public void method(){
//局部内部类
class AA{
}
}
{
//局部内部类
class BB{
}
}
public Person(){
//局部内部类
class CC{
}
}
}
03 局部内部类的使用
public class InnerClassTest1 {
// 开发中很少见
public void method(){
// 局部内部类
class AA{
}
}
// 返回一个实现了Comparable接口的类的对象
public Comparable getComparable(){
// 创建一个实现了Comparable接口的类:局部内部类
//方式一:
// class MyComparable implements Comparable{
//
// @Override
// public int compareTo(Object o) {
// return 0;
// }
//
// }
//
// return new MyComparable();
//方式二: 匿名实现类的匿名对象
return new Comparable(){
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}