内部类:非静态内部类

package org.lgy.study.innerclass;

/*
非静态内部类是属于外部类对象的,而不是属于外部类。
如果想要使用非静态内部类,必须先创建一个外部类对象。
非静态内部类对象必须寄存在外部类对象里;而外部类对象不一定有内部类对象寄存其中。
如果存在一个非静态内部类对象,则一定存在一个被他寄存的外部类对象;但外部类对象存在时,它里面不一定寄存了内部类对象。
*/
public class NonStaticInnerClass{
	private String str1 = "non static str in outer";
	private int sameField = 1;
	private static String str2 = "static str in outer";
	
	//外部类的非静态成员可以使用非静态内部类
	public void method1(){
		System.out.println("non static method in outer");
		//外部类必须显式创建非静态内部类对象来访问其实例成员,即使是内部类的似有成员也可以直接访问。
		InnerClass in = new InnerClass();
		System.out.println("in.str1 = " + in.str1);
		in.method1();
	}
	
	//不允许在外部类的静态成员(静态方法、静态初始化块)中使用非静态内部类(定义变量、创建实例)
	public static void method2(){
		System.out.println("static method in outer");
		//new InnerClass().method1();
	}
	
	//因为内部类作为外部类的成员,所以可以使用任意的访问控制符(private、default、protected、public)
	private class InnerClass{
		//非静态内部类里可以定义非静态成员(成员变量、成员方法、普通初始化块)
		private String str1 = "non static str in inner";
		
		private int sameField = 2;
		//非静态内部类里不可以定义静态成员(成员变量、成员方法、静态初始化块)
		//private static String str2 = "static str in inner";
		
		public void method1(){
			System.out.println("non static method in inner");
			//非静态内部类可以自由访问外部类的成员(成员变量、成员方法、实例成员、静态成员)
			System.out.println("str1 in outer: " + str1);
			System.out.println("str2 in outer: " + str2);
			method2();
			
			//外部类、非静态内部类、内部类方法中都有名为sameField的变量,
			//可以按如下方式来访问各个作用域里的同名变量
			int sameField = 3;
			System.out.println(sameField);
			System.out.println(this.sameField);
			System.out.println(NonStaticInnerClass.this.sameField);
		}
		/*
		public static void method2(){
			System.out.println("static method in inner");
		}*/
	}
}

 

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