内部类

内部类

  内部类就是在写在其它类中的类。

内部类

代码演示

使用已知变量在屏幕上输出,30、20、10(成员内部类)

Outer类

class Outer {
			public int num = 10;
			private String s="我是外部类的私有成员";
			//内部类inner
			class Inner {
				public int num = 20;
				public void show() {
					int num = 30;
					System.out.println(num);//输出的是30,因为就近原则
					
                    /* 输出的是20,因为this是对当前类的引用,
                       当前的类就是inner(show方法在inner里,输出的位置在show方法里,
                       对于show方法来说,直接包含的它的类,也就是当前类是inner),
                       也就是在成员变量和局部变量名字相同的情况下,
                	   用this来区别成员变量的局部变量 */
                	                   	   
					System.out.println(this.num);
					
					/*输出的是10,因为这个num是外部类Outer的通过Outer来调用,
					  又因为是这个num与inner类(成员内部类)中的的变量名字相同,				
				   	  因此用this来调用,表示当前类(Outer类)引用*/
				   	  
					System.out.println(Outer.this.num);
					
					//内部类可以直接访问外部类的成员(包括私有成员),
					//但外部类不能访问内部类私有成员
					System.out.println(s);
				}
			}
		}

InnerClassTes测试类

class InnerClassTest {
			public static void main(String[] args) {
			    //外部类访问内部类的实例化格式
				Outer.Inner oi = new Outer().new Inner();
				oi.show();
			}	
		}

结果

30
20
10
我是外部类的私有成员
局部内部类

Outer类

class Outer {
	
	// 成员变量
	private int a = 35 ;
	
	// 成员方法
	public void show() {

		// 定义一个局部变量
		final int b = 45 ;//JDK1.7之前要加final不然报错  但是在JDK1.8 不用加 不会报错
		
		// 局部内部类
		class Inner {
			public void method(){
				System.out.println(a) ;
				System.out.println(b) ;
			}
		}
				/* 创建对象,等到外部类调用show方法时就调用
				到这个对象(Inner)及对象的调用方法,这样就可以间接访问内部类了*/
		Inner i = new Inner() ;

		// 调用放
		i.method() ;
	
	}
}

InnerText类

class InnerText {

	public static void main(String[] args) {
		
		// 创建Outer的对象
		Outer out = new Outer() ;

		// 调用show方法,通过对象调用方法来间接访问内部类
		out.show() ;
	}
}

结果

35
45
静态内部类

Outer类

class Outer {
	
	// 成员变量
	private static String a = "我是静态成员变量" ;

		// 静态内部类
		static class Inner {
			public void method(){
				System.out.println(a) ;//这里的a如果是不是静态的就不能访问,静态只能访问静态,非静态既能访问静态也可以访问非静态
			}
		}

}

InnerText类

class InnerText {

	public static void main(String[] args) {
		
		// 创建Outer的对象,外部类访问静态内部类的方式
		Outer.Inner out = new Outer.Inner();

		// 调用show方法
		out.method();
	}
}

结果

我是静态成员变量