内部类
概述
定义在其他类内部的类
特点
1、可直接访问外部类成员,包括私有。
2、外部类访问内部类成员,必须创建对象
public class InterClassDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
class Outer {
private int num = 10;
public void method() {
int num2= 20;
class Inter {
public void show() {
//直接访问外部类成员num
System.out.println(num);
System.out.println(num2);
}
}
//创建对象访问内部类成员
Inter i = new Inter();
i.show();
}
}
内部类位置
成员内部类
访问格式
外部类名.内部类名 对象名 = 外部对象.内部对象
常见修饰
private:安全性
static:看成外部类成员
访问格式:外部类名.内部类名 对象名 = 外部类名.内部类名()
注意:
public class InterClassDemo {
public static void main(String[] args) {
Outer.Inter oi = new Outer().new Inter();
oi.show();
}
}
class Outer {
private int num = 10;
//成员内部类
class Inter {
int num= 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
//输出
//30
//20
//10
局部内部类
特点
A:可以直接访问外部成员
B:在局部位置可创建内部类对象,调用内部类方法,实现功能。
访问局部变量
1、变量必须被final修饰(1.8之前)
2、JVM自动在底层添加了final,不用再手动添加(1.8之后)
原因:局部变量随着方法消失而消失,而堆内存(方法中的内部类)不会立刻消失,内部类中调用变量时就会出现问题。所以加上fianl,使变量变常量,消失了还可以使用。
匿名内部类
前提
存在一个类或接口
格式
new 类名或接口名(){重写方法};
本质、
一个继承了该类或者实现了该接口的子类匿名对象。
public class InterClassDemo2 {
public static void main(String[] args) {
Outer1 o = new Outer1();
o.method();
}
}
interface Inter {
public abstract void show();
}
class Outer1 {
public void method() {
//匿名内部类(对象)
new Inter() {
public void show() {
System.out.println("show");
}
}.show();
}
}