内部类的分类:
- 非静态内部类
- 静态成员内部类
- 局部内部类
- 匿名内部类
成员内部类
- 定义:在一个外部类中有成员变量和成员方法,那么成员内部类就是整个一个类当成外部类的成员对待
- 访问方式:内部类访问外部类,内部类可以直接访问外部类,包括私有成员变量,因为内部类拥有外部类的引用是类名.this
- 外部类访问内部类,外部类访问外部类的成员,必须要建立内部类的对象,
- 格式:外部类名.内部类名 = 外部类对象.内部类对象()
存放位置:在外部类里,在外部类的成员方法外
public class Outer {
class Inter {
public void speak() {
System.out.println("我是内部类");
}
}
}
Outer.Inter inter = new Outer().new Inter();
inter.speak();
静态内部类
- 定义:就是在成员内部类的基础上加上static
- 格式: 外部类名.内部类名 = 外部类.内部类对象()
public class Outer {
static class Inter {
public void speak() {
System.out.println("我是静态内部类");
}
}
}
Outer.Inter inter = new Outer.Inter();
inter.speak();
局部内部类
- 定义:在外部类成员方法中定义的内部类,他更像局部变量
- 注意:
- 方法内部类只能在定义该内部类的方法中使用,不可以在此方法外对其实例化
- 与局部变量一样,方法的内部类修饰符只有final 和abstract
- 静态方法内的方法内部类,静态方法是没有this引用的,因此在静态方法内的内部类遭遇同样的待遇,即:只能访问外部类的静态成员
public void Outer() {
class Inter {
public void speak() {
System.out.println("我是局部内部类");
}
}
Inter inter = new Inter();
inter.speak();
}
匿名内部类
- 没有名字的内部类,他是内部类的简化写法
- 主要为了实现接口或者继承外部类
public interface Speak {
public void speak();
}
public class Outer {
public void speak() {
new Speak() {
public void speak() {
System.out.println("我是匿名内部类");
}
}.speak();
}
}
new Outer().speak();