Java_内部类

本博文为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/8924845

1.内部类细节

        一般内部类是被私有修饰的 
        局部类要使用静态成员,该局部也必须是静态
        static和private用来修饰成员的,当在方法内定义类时,由于该类定义在局部,故不能被static和private修饰

       匿名内部类必须继承一个类,或者实现一个接口

2.内部类代码实现

/*
内部类
Strawberry2013/5/14
*/
class Demo
{
	public static void main(String[] args)
	{
		//Out.In  oi = new Out().new In();//如果In没有私有,则Out可以访问内部成员In
		//oi.show();如果内部类In没有被private修饰,则可以使用new Out().new In()创建
		
		Out out = new Out();
		out.show();
	}
}

class Out
{
	private int x = 2;
	private class In
	{
		//private static int y = 3;	静态修饰符,内部类必须为static的
		private int x =3; 
		public void show()
		{
			int x = 6;
			System.out.println("x = "+ x);			//x = 6,函数show内部x
			System.out.println("x = "+ this.x);		//x = 3,本类In成员x
			System.out.println("x = "+ In.this.x);	//x = 3,In类成员x
			System.out.println("x = "+ Out.this.x);	//x = 2,Out类成员x
			//System.out.println("x = "+ Out.x);	//如果外部类Out的成员x被static修饰,则可以直接使用Out.x访问
		}
	}
	public void method()
	{
		In in = new In();
		in.show();

		//访问In2的show方法
		//new In2().show();如果In2不是静态的,不能这样访问
		//可以将method()当做外部类的一个成员方法,In2也当做外部类的成员,
		//因为静态成员在类加载时,已经存在于内存中,如果In2不是静态的,则new In2()是找不到In2的类
		//静态方法要只能访问静态成员,故In2必须被static修饰,
		//由于show方法非静态,先应该new In2(),再调用show方法
		//new In2().show();
	}
	static class In2
	{
		void show()
		{
			//如果在主函数中调用该show方法时,由于内部类In2是静态的,Out.In2可以直接访问
			//由于show方法不是静态的,故必须new一个内部类,new Out.In2(),再调用show方法
			//new Out.In2().show();
			int x = 3;
		}
	}
	public void show()//如果show接收参数,也必须定义为final, final int x
	{
		final int y = 3;	//方法区的内部类要访问方法局部变量,要被final修饰
		class In3			//内部类不能被static和private修饰,
		{
			void show()
			{
				System.out.println("s");
			}
		}
		//new In3().show();
	}
}

3.匿名内部类

/*
匿名内部类必须继承一个类,或者实现一个接口
*/

class Demo1
{
	public static void main(String[] args)
	{
		Inter in = new Inter()
		{
			public void show()
			{
				System.out.println("haha");
			}
		};
		in.show();
//或者
		new Inter()
		{
			public void show()
			{
				System.out.println("haha");
			}
		}.show();
	}
}
interface Inter
{
	abstract public void show();
}


 

你可能感兴趣的:(类,内部类,面向对象,匿名内部类,匿名)