1.内部类
在一个类的内部再定义一个类,内部类和外部类名字不能相同。
可以分为
- 成员内部类:静态、非静态
- 局部内部类:方法内、代码块内、构造器内,匿名内部类
2.成员内部类
(1)非静态
① 和普通类差不多,可以在内部定义属性、方法、构造器等结构。
② 可以使用public、protected、缺省、private修饰。
③ 可以用abstract、final修饰。
④ 不能用static修饰内部类中的结构。
public class Person {
String name = "张三";
public void eat() {
System.out.println("张三吃东西");
}
class Bird {
String name = "小杜";
public void fly(String name) {
System.out.println(name+"起飞");
}
}
}
⑤ 使用外部类的结构
成员内部类可以直接使用外部类的所有成员,包括私有数据。
public void fly(String name) {
System.out.println(name+"起飞"); //形参
System.out.println(this.name+"起飞"); //内部类属性
System.out.println(Person.this.name+"起飞"); //外部类属性
}
⑥ 使用内部类的结构
Person类中,直接创建对象
Bird bird1 = new Bird();
bird1.fly("3");
//或者
Person.Bird bird2 = new Person.Bird();
bird2.fly("2");
Person 类外
Person person = new Person();
Person.Bird bird3 = person.new Bird();
bird3.fly("3");
(2)static修饰,静态
内部类是静态的,有一个静态属性age。
① 当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的。
② 内部类成员想要用static修饰,则内部类也要用static修饰,否则报错。
public class Person {
String name = "张三";
public void eat(String name) {
}
static class Bird {
String name = "小杜";
static int age = 4;
public void fly(String name) {
System.out.println(name + "起飞"); //形参
}
}
}
③ 调用内部类的静态结构
public static void main(String[] args) {
System.out.println(Bird.age);
}
3.局部内部类
(1)局部内部类
写在方法或代码块中,先声明后使用,作用域为所在花括号内。
public class Person {
String name = "张三";
public void eat(String name) {
class Bread{
private int price;
public void sell(){
System.out.println("卖面包");
}
}
}
}
特点
- 局部内部类仍是一个独立的类,编译后会产生独立的.class文件,但是前面会加上外部类的类名、$符号和数字编号。
- 只能在作用域范围内使用,先声明后使用,类似局部变量,因此局部内部类不能用权限修饰符。
- 可以使用外部类的成员,包括私有的。
- 局部内部类不能使用static修饰,因此也不能包含静态成员。
(2)匿名内部类
某个局部类只需要使用一次,定义在new的后面,隐含实现一个接口或一个类。
Java匿名内部类