第二节 局部内部类
非静态内部类扮演着非静态成员
局部内部类同样也是扮演着局部成员,但局部内部类实例不会因方法的结束而立即消失
局部内部类的定义与创建
public class CreateLocalInnerClass {
public static void main(String[] args) {
Outter o = new Outter();
o.localInnerClass();
}
}
class Outter{
public void localInnerClass() {
// 定义局部内部类
class Inner {
public Inner() {
System.out.println("Inner 实例创建成功!");
}
}
// 创建 Inner实例,方法与普通类实例创建一致
Inner i = new Inner();
}
}
/*
* 执行结果
* Inner 实例创建成功!
*/
局部内部类与局部变量之间的访问
局部内部类可以访问局部变量(某些版本的jdk无法访问,但可以访问 final 修饰的局部变量,因为局部变量随着方法结束而结束,而局部内部类实例不会如此)
同样,局部内部类可以访问外部类的字段与方法
public class TestLocalInnerClass {
public static void main(String[] args) {
Outter o = new Outter();
o.localInnerClass();
}
}
class Outter{
public void localInnerClass() {
// 定义局部变量
int localVar = 520;
// 定义局部内部类
class Inner {
public void printLocalVar() {
// 访问局部变量
System.out.println(localVar);
}
}
new Inner().printLocalVar();;
}
}
/*
* 执行结果
* 520
*/
局部内部类实例不会随着方法的运行结束而立即消失
// 定义接口的目的是能够接受Inner内部类的实例,当print方法结束,Inner类就失效了
interface ForInner{
void print();
}
public class TestLocalInnerClass {
public static void main(String[] args) {
Outter o = new Outter();
o.localInnerClass();
o.i.print();
}
}
class Outter{
ForInner i = null;
public void localInnerClass() {
class Inner implements ForInner{
public void print() {
// 访问局部变量
System.out.println("Calling print() successfully!");
}
}
// 将实例对象给ForInner接口类型
i = new Inner();
}
}
/*
* 执行结果
* Calling print() successfully!
*/
静态方法中的局部内部类
当局部内部类处于静态方法中,就只能访问外部类中的静态方法和字段
public class CreateInnerClass {
public static void main(String[] args) {
Outter.createLocalInnerClass();
}
}
class Outter{
int x = 520;
public static void createLocalInnerClass() {
// 在静态方法中定义局部内部类
class Inner{
public void printNotStaticFiled() {
// 访问非静态成员变量x
System.out.println(x);
}
}
}
}
/*
* 错误
* Cannot make a static reference to the non-static field x
*/