JAVA中的内部类

/*
 * 内部类的访问规则:
 * 	1、内部类可以直接访问外部类中的成员,包括私有
 * 		之所以可以直接访问外部类成员,是因为内部类中持有一个外部类的引用,格式:外部类名.this
 * 	2、外部类要访问内部类必须建立内部类对象
 * 
 * 
 * 内部类可以被私有或静态等修饰
 * */

/*class Outer {
	private int x = 3;

	class Inner { // 内部类
		int x=4;
		void function() {
			int x=6;
			System.out.println("Inner:" + this.x);
			System.out.println("Outer:" + Outer.this.x);
		}
	}

	void method() {
		Inner in=new Inner();
		in.function();
		System.out.println(x);
	}
}

public class InnerClassDemo {
	public static void main(String args[]) {
		//Outer out = new Outer();
		//out.method();
		
		//直接访问内部类成员
		Outer.Inner in =new Outer().new Inner();
		in.function();		
	}
}*/
class Outer {
	private static int x = 3;

	static class Inner { // 内部类
		void function() {
			System.out.println("Inner:" + x);
		}
	}
}

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

下面是匿名内部类

/*
 * 匿名内部类
 * 1、匿名内部类就是内部类的简写格式
 * 2、定义匿名内部类前提,内部类必须继承一个类或者实现接口
 * 3、匿名内部类的格式:new父类或者接口(){ 定义子类内容 }
 * 4、其实匿名内部类就是一个匿名子类对象,可以理解为带内容的对象
 * 
 * */
abstract class AbsDemo {
	abstract void show();
}

class Outer2 {
	int x = 3;

	/*
	 * class Inner extends AbsDemo {
	 * 
	 * void show() { System.out.println("show:"+x); } }
	 */

	public void function() {
		// new Inner().show();
		new AbsDemo() {
			void show() {
				System.out.println("show:" + x);
			}

			void abc() {
				System.out.println("abc");
			}
		}.show();// 这是匿名内部类,即简化后的绿色注释部分
	}
}

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

如果要调用abc()和show()两个方法那么就给匿名内部类起个名字,但是注意,使用的方法必须是父类中有的方法(就是多态)

如下面,注意AbsDemo类和上面有不同

abstract class AbsDemo {
	abstract void show();

	abstract void abc();
}

class Outer2 {
	int x = 3;

	public void function() {
		AbsDemo a1 = new AbsDemo() {
			void show() {
				System.out.println("show:" + x);
			}

			void abc() {
				System.out.println("abc");
			}
		};
		a1.show();
		a1.abc();
	}
}

如果AbsDemo类中没有abc方法,那么就算起了名字,也不能调用,会编译错误。

那么我要用abc方法的话就可以直接写成     

new AbsDemo(){ void show(){}      void abc(){} }.abc();

当然这个时候和继承关系不大,可以不继承单独写个内部类或者函数,只是举个例子。

下面是个练习,可以自己试一下

interface Inter2{
	void method();
}

class Test2{
	//补足代码,通过匿名内部类
	
}

public class InnerClassTest {
	public static void main(String args[]){
		Test2.function().method();		
	}
}

答案如下

interface Inter2{
	void method();
}

class Test2{
	//补足代码,通过匿名内部类
	static Inter2 function(){
		return new Inter2(){
			public void method(){
				System.out.println("abc");
			}
		};
	}
}

public class InnerClassTest {
	public static void main(String args[]){
		Test2.function().method();
		//test.function    test类中有一个静态的方法function
		//.method   说明function方法运算后的结果是一个对象,而且是一个Inter类型的对象
		//因为只有Inter类型的对象,才可以调用method方法
		
	}
}



                                                                                    ----------------------By   仔鸡


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值