1,内部类概述
-
java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。
2,内部类访问特点
-
内部类可以直接访问外部类的成员,包括私有。
-
外部类要访问内部类的成员,必须创建对象。
-
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
-
-
案例
class Demo1_InnerClass {
public static void main(String[] args) {
//Inner i = new Inner();
//i.method();
//外部类名.内部类名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner(); //创建内部类对象
oi.method();
}
}
class Outer {
private int num = 10;
class Inner {
public void method() {
System.out.println(num);
}
}
}
3,成员内部类私有使用
-
private
class Demo2_InnerClass {
public static void main(String[] args) {
//Outer.Inner oi = new Outer().new Inner();
//oi.method();
Outer o = new Outer();
//o.print();
}
}
class Outer {
private int num = 10;
private class Inner {
public void method() {
System.out.println(num);
}
}
//内部类别私有了,我们只能提供对外的方法创建对象
public void print() {
Inner i = new Inner();
i.method();
}
}
4,静态成员内部类,
-
static
-
成员内部类被静态修饰后的访问方式是:
-
外部类名.内部类名 对象名 = 外部类名.内部类对象;
class Demo1_InnerClass {
public static void main(String[] args) {
//外部类名.内部类名 对象名 = 外部类名.内部类对象;
Outer.Inner oi = new Outer.Inner();
//Outer.new Inner();
Outer.Inter oo = new Outer.Inner();
oi.method();
Outer.Inner2.print();
}
}
class Outer {
static class Inner {
public void method() {
System.out.println("method");
}
}
static class Inner2 {
public static void print() {
System.out.println("print");
}
}
}
【1】内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this
-
要求:使用已知的变量,在控制台输出30,20,10。
class Test1_InnerClass {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
//要求:使用已知的变量,在控制台输出30,20,10。
//内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
5,局部内部类访问局部变量
【1】代码
class Demo1_InnerClass {
public static void main(String[] args) {
Outer o = new Outer();
//o.method();
}
}
//局部内部类
class Outer {
public void method() {
final int num = 10;
class Inner {
public void print() {
System.out.println(num);
}
}
Inner i = new Inner();
i.print();
}
/*public void run() {
Inner i = new Inner(); //局部内部类,只能在其所在的方法中访问
i.print();
}*/
}
【2】图解
-
局部内部类访问局部变量必须用final修饰
-
局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
-
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
-
但是jdk1.8取消了这个事情,所以我认为这是个bug
。