概述
- 内部类即在类中定义另一个类
- 内部类的class文件的命名时:外部类$内部类.class
- 内部类可以直接访问外部类的所有成员
成员内部类
概述
定义在成员位置
定义格式
public class 外部类{
class 内部类{
}
}
访问格式
- 间接访问:在外部类提供一个方法创建成员内部类的对象并调用方法,在其他类创建外部类的对象,调用内部类的方法。
- 直接访问:外部类.内部类 变量名=new 外部类().new 外部类();
使用场景
- 当某个类除了它的外部类,不再被其他的类使用时
- 当描述事物A时,发现该A事物内部还具备另一个事物B,而且B事物需要用到A事物的一些成员数 据,那么事物B就可以使用内部类来描述。
class 人 {
氧气
血液
}
class 心脏 {
}
注意事项
- 如果成员内部类使用private修饰,则不能使用直接访问方式创建成员内部类的对象,只能间接访问。
- 当成员内部类和外部类出现同名的成员时,要访问外部类的成员,则要使用以下格式访问:
- 外部类名.this.成员变量名;
- 外部类名.this.成员方法(参数列名);
- 在成员内部类中不能定义静态变量,如果要定义,则该成员内部类需要定义为静态内部类。
局部内部类
概述
定义在外部类的方法中的类
定义格式
在外部类的方法中定义
访问格式
只能在外部类的方法中创建对象访问
注意事项
- 局部内部类就像是方法里面的局部变量一样,是不能有public、protected、private修饰符
- 局部内部类中访问局部变量,该变量需要使用fianl修饰
代码说明
public void test(){
int num = 100;
// 局部内部类
class Inner {
// 成员变量
private String name;
private int age;
public Inner(String name, int age) {
supur();
this.name = name;
this.age = age;
}
//普通方法
public void doSomething() {
System.out.println(this.name);
System.out.println(this.age);
System.out.println(num);
}
}
}
匿名内部类
概念
没有明确的类的语法,直接就创建已知类的子类对象或接口的实现对象
定义格式
new 类或接口(){
//重写方法
};
代码说明
public static void main(string args)
Pet p1 = new Pet(a) {
@Override
public void eat() {
System.out.println(this.getName + "吃鱼");
}
};
p1.setName("tom");
p1.eat();
}
常见问题
-
匿名内部类可以定义构造方法?
不能,因为不知道类名是什么
-
匿名内部类能定义新的成员方法和成员变量吗?
可以,但不能使用static修饰,但无法显式的通过“实例名.方法名(参数)”的形式调用,因为使用new创建的是“上转型对象”(即父类声明指向子类对象)。所以一般不会为匿名内部类添加成员变量和成员方法。