内部类:局部内部类

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();
	}
}
/*
结果:
---
***
---
*/

 

你可能感兴趣的:(局部内部类)