第二节 局部内部类

第二节 局部内部类

非静态内部类扮演着非静态成员

局部内部类同样也是扮演着局部成员,但局部内部类实例不会因方法的结束而立即消失

局部内部类的定义与创建
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
 */

你可能感兴趣的:(Java,内部类,java,javase,javaee,jdk)