欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内部类:局部内部类

程序员文章站 2022-05-22 09:02:15
...
package org.lgy.study.innerclass;

public class LocalInnerClass{
	public static void main(String[] args){
                 //如果需要在局部内部类中访问所在方法的局部变量,则必须将局部变量声明为final
                 final int x = 1;
		//局部内部类仅在该方法里有效,由于局部内部类不能在外部类的方法以外的地方使用,
		//因此局部内部类也不能使用访问控制符和static修饰符修饰。
		//如果需要用局部内部类定义变量、创建实例、派生子类,那么都只能在局部内部类所在的方法内进行
		class InBase{
                        //局部内部类中不能定义static成员
                        //static String str = "123";
			private String var = "***";
			private void method1(){
				System.out.println("method1 in InBase");
			}
		}
		
		class InSub extends InBase{
			private int var = 1;
			private void method1(){
				System.out.println("method1 in InSub");
			}
		}
		
		InBase inBase = new InSub();
		//即使内部类的成员变量和成员方法是私有的,也可以直接访问
		System.out.println(inBase.var);
		inBase.method1();
	}
}

 

package org.lgy.study.innerclass;

public class LocalInnerClass{

	//method1是外部类的非静态成员方法,当调用method1是已经创建了外部类的对象,
	//所以method1中既可以访问外部类的非静态成员,也可以访问外部类的静态成员,
	//所以在method1的局部内部类中也既可以访问外部类的非静态成员,也可以访问外部类的静态成员。
	public void method1(){
		int a = 1;
		class Inner1{
			//局部内部类中不能定义static成员
			//static String str;
			
			public void method1(){
				//由于局部内部类所在方法是非静态成员方法,所以可以通过如下方法访问外部类
				//的静态成员
				LocalInnerClass.method4();
				//由于局部内部类所在方法是非静态成员方法,所以可以通过如下方法访问外部类
				//的非静态成员
				LocalInnerClass.this.method3();
				
				//局部内部类中可以直接访问所在方法中的局部变量,
				//无需将局部变量声明为final
				System.out.println(a);
			}
		}
		
		new Inner1().method1();
	}
	
	//method2是外部类的静态成员方法,当调用method2时可能没有创建外部类实例,
	//所以method2中只能访问外部类的静态成员变量,
	//所以在method2的局部内部类中也只能访问外部类的静态成员变量。
	public static void method2(){
		int a = 1;
		class Inner2{
			public void method1(){
				//由于局部内部类所在的方法是静态成员方法,所以可以通过如下方法访问外部类
				//的静态成员
				LocalInnerClass.method4();
				//由于局部内部类所在的方法是静态成员方法,所以无法访问外部类的非静态成员方法。
				//method3();
				
				System.out.println(a);
			}
		}
		
		new Inner2().method1();
	}
	
	private void method3(){
		System.out.println("***");
	}
	
	private static void method4(){
		System.out.println("---");
	}
	
	public static void main(String[] args){
		new LocalInnerClass().method1();
		LocalInnerClass.method2();
	}
}
/*
结果:
---
***
---
*/