1.内部类定义

     可以将一个类的定义放在另一个类的定义内部,这就是内部类。广泛的说,目前内部类可以被分成四种,分别是成员内部类、静态内部类、局部内部类、匿名内部类。

2内部类分类

2.1成员内部类

它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。内部类和外部类的实例变量可以共存。在内部类中访问实例变量:this.属性;在内部类访问外部类的实例变量:外部类名.this.属性。在外部类的外部访问内部类,使用out.inner.属性。

示例:

class Outer  //外部类;  
{  
	 private int x=3;
	 private static int y=4;
		
	 	
//成员内部类
	 class Inner{
	 	private int x=6;
	 	void function(){
	 		int x=8;
	 		System.out.println(x);//
	 		System.out.println(this.x);//访问内部类实例变量
	 		System.out.println(Outer.this.x);//在内部类中访问外部类的非静态成员
	 		System.out.println(Outer.this.y);//在内部类中访问外部类的静态成员
	 	}
	 }

}
public  class InsideClassDemo   
{  
	public static void main(String[] args)  
	{  
		// 创建成员内部类的对象,首先需要先创建外部类的实例 ,格式是:外部类.内部类  变量名=new 外部类().new 内部类()
		Outer.Inner inner=new Outer().new Inner();
		inner.function();
	}  
}

2.2 静态内部类

内部类定义时加上static关键字。只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。

示例:

class Outer  //外部类;  
{  
	 private int x=3;
	 private static int y=4;
		
	 	
//成员内部类
	 static class Inner{
	 		 	
	 	void function(){
	 	//System.out.println(x);编译出错—不能访问外部类的非静态成员或非静态函数
	 	System.out.println(y);//只能访问外部类的静态成员或静态函数
	 	}
	 }

}
public  class InsideClassDemo   
{  
	public static void main(String[] args)  
	{  
		// 创建成员内部类的对象,首先需要先创建外部类的实例 ,格式是:外部类.内部类  变量名=new 外部类.内部类()
		Outer.Inner inner=new Outer.Inner();
		inner.function();
	}  
}

2.3 局部内部类

在方法中定义一个内部类 ,这个类就是局部内部类 

class Outer  //外部类;  
{  
	int x=3;
//局部内部类
	void function(final int a){
		int m=4;
		class Inner{
			void method(){
				System.out.println(x);//这个地方需要注意一下:访问x的顺序是:看看内部///类中是否有变量x,有就返回该值,没有去看看外部类的的成员方法是否有变量x,有就输出该值,没有就输出外部类的成员变量x;这里面输出3;
				System.out.println(m);
				System.out.println(a);
		
			}
			new Inner().method();//局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
		}
		/*private  class Inner1{
				
		} 像局部变量一样,不能被public, protected, private和static修饰。
		 */
	}
		
}

public  class InsideClassDemo   
{  
	public static void main(String[] args)  
	{  
		new Outer().function(7);
		new Outer().function(8);
	}  
}

2.4匿名内部类

1.匿名内部类其实就是内部类的简写格式。
        2.定义匿名内部类的前提:
                内部类必须继承一个类或者实现接口。(内部类可以直接继承外部类或者外部其他类。)
        3.匿名内部类的格式:  

new 父类名()    
            {
                    //定义子类的内容,例如:
                    void 抽象方法的方法名()
                    {
                            System.out.println("x="+x);            
                    }
            }.方法名();


        4.其实,匿名内部类就是一个匿名子类对象,而且这个对象有点“胖”,也可以理解为带内容得对象。
        5.匿名内部类中定义的方法最好不要超过3个。

示例:

class Outer  //外部类;  
{  
	int x=3;
//匿名内部类
	void function(){
		new Inner (){
			 void method(){
				 System.out.println(x);
			 }
		 }.method();
	}
		
}
abstract class Inner{
	abstract void method();
}

public  class InsideClassDemo   
{  
	public static void main(String[] args)  
	{  
		new Outer().function();
			
	}  
}