1.内部类的定义
把类定义在另一个类的内部,该类就被称为内部类。
2.内部类的访问规则
a:可以直接访问外部类的成员,包括私有
b:外部类要想访问内部类成员,必须创建对象
3.内部类的分类
a:成员内部类
b:局部内部类
4.成员内部类
a:成员内部类不是静态的:外部类名.内部类名 对象名 = new 外部类名().new 内部类();
b:成员内部类是静态的:外部类名.内部类名 对象名 = new 外部类名.内部类名();
输出结果:30,20,10,10
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public viod show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
System.out.println(new Outer().num);
}
}
}
5.局部内部类访问局部变量必须加final修饰
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
class Outer {
private int num = 10;
public void method() {
final int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
//从内部类中访问本地变量num2; 需要被声明为最终类型
System.out.println(num2);//20
}
}
//System.out.println(num2);
Inner i = new Inner();
i.show();
}
}
class InnerClassDemo5 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
6.匿名内部类
a:是局部内部类的简化形式
b:前提:存在一个类或者接口
c:格式:
new 类名或者接口名() {
重写方法;
}
d:本质:其实是继承该类或者实现接口的子类匿名对象
7.匿名内部类在开发中的使用
interface Person {
public abstract void study();
}
class PersonDemo {
public void method(Person p) {
p.study();
}
}
class PersonTest {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(new Person() {
public void study() {
System.out.println("好好学习,天天向上");
}
});
}
}