java内部类

// 代码1:内部类对外部类可见
class Outer1 {
	// 创建私有内部类对象
	public Inner in = new Inner();

	// 私有内部类
	private class Inner {
		//这里面增加了包可见的构造方法
		//ter1$Inner(Outer1, Outer1$Inner);
		//所以outer1中可以创建Inner对象
		
		//private Outer1$Inner(Outer);
		//final Outer this$0; 这个东西指向外部类对象
	}
}

// 代码2:外部类对内部类可见
class Outer2 {
	// 外部类私有数据域
	private int data = 0;

	/*
	 * 添加了
	 * static int access$0(Outer2);
	 * 
	 * 外部类中偷偷添加了访问私有变量的静态方法,
	 * 从而能从内部类中访问外部类的 私有field
	 */
	
	// 内部类
	class Inner {
		void print() {
			// 内部类访问外部私有数据域
			System.out.println(data);
			/*
			 * System.out.println(this$0.access$0(Outer2));
			 * this$0 是 外部类对象的引用
			 */
		}
	}
}

// 代码3:静态内部类对外部变量的引用
class Outer3 {
	private static int i = 0;
	int unstatici = 1;
	// 创建静态内部类对象
	public Inner in = new Inner();

	// 静态
	private static class Inner {
		
		/*
		 * private Outer3$Inner();
		 * Outer$Inner(Outer3$Inner);
		 * 
		 * 没有了指向外部类对象的this$0
		 * 
		 * 所以静态内部类 无法 访问外部类的 非static field
		 */
		
		
		public void print() {
			System.out.println(i); // 如果i不是静态变量,这里将无法通过编译。
//			int i = unstatici;
		}
	}
}


//代码4

class Outter4{  
    public void outMethod(){  
           final int beep=0;  
           int i = 1;
           class Inner{  
        	   /*
        	    * 局部内部类(方法中的类)
        	    * 只能访问
        	    * 局部final变量(方法中的final field) 
        	    */
        	   
        	   /*
        	    * why?
        	    * 
        	    * 这里多了一个beep的备份
        	    * final int val$i;
        	    * 为了保持外部与内部的一致性规定为final
        	    */
                 //使用beep  
        	   void test(){
        		   int temp = beep;
//        		   temp = i;
        	   }
           }  
           Inner in=new Inner();  
    }  
} 

内部类基本使用方法: http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html

 

原文地址 http://hxraid.iteye.com/blog/494230

 

posted on 2015-08-18 10:27  reddit  阅读(204)  评论(0)    收藏  举报

导航