Java内部类详解
一、定义
Java中的内部类(Inner Classes)是一种在一个类的内部定义另一个类的机制。内部类可以访问其所在的外部类的成员变量和方法,甚至是私有的成员。
内部类主要分为:成员内部类、局部内部类、匿名内部类和静态内部类。
二、成员内部类
1、定义: 成员内部类是在一个类的内部定义的类,其定义和方法与成员变量类似。它可以访问外部类的所有成员变量和方法。
理解:成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
2、代码理解:
class Outer {
private int outerVar = 10;
class Inner {
void display() {
System.out.println("Outer variable is " + outerVar);
}
}
}
注意:如果要访问外部类的同名成员,需要以下面的形式进行访问
外部类.this.成员变量
外部类.this.成员方法
3、如何创建成员内部类对象
要创建成员内部类的对象,前提是必须存在一个外部类的对象
第一种方式:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
第二种方式:
Outter.lnnerinner1 = outter.getinnerlnstance();
4、访问权限
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限
三、局部内部类
1、定义: 局部内部类是在方法、构造器或代码块中定义的类,其作用域仅限于所在的代码块中。
2、代码理解
class Outer {
void myMethod() {
class LocalInner {
void display() {
System.out.println("This is a local inner class");
}
}
LocalInner localInner = new LocalInner();
localInner.display();
}
}
注意:局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private 以及static修饰符的 。
四、静态内部类
1、定义: 静态内部类使用 static
关键字进行修饰,不依赖于外部类的实例。静态内部类只能访问外部类的静态成员。
2、代码理解
class Outer {
private static int outerVar = 10;
static class StaticInner {
void display() {
System.out.println("Outer static variable is " + outerVar);
}
}
}
3、引用
要创建静态内部类的对象,可以直接通过外部类名来引用
Outer.StaticInner inner = new Outer.StaticInner();
inner.display();
注意:静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法
五、匿名内部类
1、定义:匿名内部类没有名字,是一种简化的内部类定义方式,通常用于实现接口或继承一个类的实例。
2、代码理解:
interface Greeting {
void greet();
}
class Outer {
void display() {
Greeting greeting = new Greeting() {
public void greet() {
System.out.println("Hello from anonymous inner class");
}
};
greeting.greet();
}
}
3、经验:
一般使用匿名内部类的方法来编写事件监听代码
匿名内部类也是不能有访问修饰符和static修饰符的
匿名内部类是唯一一种没有构造器的类
六、深入理解内部类
问题:为什么局部内部类和匿名内部类只能访问局部final变量?
背景:当test方法执行完毕之后,变量a的生命周期就结束了,而此时Thread对象的生命周期很可能还没有结束,那么在Thread的run方法中继续访问变量a就变成不可能了,但是又要实现这样的效果,怎么办呢?Java采用了复制的手段来解决这个问题。
方案:也就说如果局部变量的值在编译期间就可以确定则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。
问题:当在run方法中改变变量a的值的话,会造成数据不一致性
解决:java编译器就限定必须将入参变量限制为final变量。
汇总理解图: