一、概述
内部类:将类置于其他类内部
- 成员内部类
定义在一个类之中
//将类放在其他类内部
public class Body {
//定义成员内部类
public class Heart{
//内部类方法
public void beat(){
System.out.println("beat");
}
}
}
访问内部类数据与方法
- 1.通过外部类方法访问
public class Body {
//定义成员内部类
public class Heart{
//内部类方法
public void beat(){
System.out.println("beat");
}
}
public void methodBody1(){
Heart heart = new Heart(); //实例对象访问
heart.beat();
//或
new Heart().beat(); //匿名对象访问
}
}
//创建外部类对象
Body body = new Body();
//通过外部类对象的方法访问成员内部类
body.methodBody1();
- 2.通过创建成员内部类对象访问(.new)
//创建内部类对象
Body.Heart heart = new Body().new Heart();
//通过内部类对象访问方法
heart.beat();
-
局部内部类
-
1.方法内部类
定义在一个类的方法当中
-
public class Body {
public void methodBody(){
final int num = 10; //局部内部类如果要访问所在方法的局部变量,那个这个变量为final
//局部内部类 (没有任何修饰符)
class Habit{
public void showHabit(){
System.out.println("num");
System.out.println("habit");
}
}
//局部内部类 只能通过所在方法进行调用
Habit habit = new Habit();
habit.showHabit();
//或
new Habit().showHabit;
}
}
- 2 匿名内部类
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
}; //注意分号,说明整体为一个语句
public class Demo02InnerClass {
public static void main(String[] args) {
//定义匿名内部类
//MyInterface是一个接口
MyInterface a = new MyInterface() {
@Override
public void method() {
System.out.println("匿名内部类");
}
}; //注意此处的分号;说明这整体为一个语句。
//访问匿名内部类方法
a.method();
}
}
注意事项:
- 成员内部类变量重名情况(.this)
public class Outer {
int num = 10;
public class Inner{
int num = 20;
public void showNum(){
int num = 30;
System.out.println(num); //就近原则 输出30
System.out.println(this.num); //this 访问本类成员 输出 20
System.out.println(Outer.this.num); //输出10
}
}
}
- 2.类的权限修饰符:
- 外部类:public (default)
- 成员内部类:public protected (default) private
- 方法内部类:什么都不写