Java内部类

内部类会被编译成OutClass$InClasss.class,匿名类会被编译成OutClass$i.class,i代表从1开始的整数。

一:局部变量、内部类成员变量和外部类成员变量重名的问题

class Out{
	private int i = 0;
	public class In{
		private int i = 1;
		public void print(int i){
			i++;				//局部变量i
			this.i++;			//内部类成员变量i
			Out.this.i++;		//外部类成员变量i
			System.out.println("局部变量i:" + i);
			System.out.println("内部类成员变量i:" + this.i);
			System.out.println("外部类成员变量i:" + Out.this.i);
		}
	}
}


二:使用内部类

public static void main(String[] args) {
		
		Out out = new Out();
		Out.In in = out.new In();
		in.print(2);
}

下面这样创建内部类是错误的:

Out.In in = new Out.In();	//错误的创建形式

注:因为内部类对象依赖于外部类的实例而存在,所以必须先创建外部类的实例。一个外部类对象可以被多个内部类对象依赖。


三:静态内部类(嵌套类)

见博客http://blog.youkuaiyun.com/zhangzeyuaaa/article/details/17201125


四:接口内部类

/**
 * 接口内部类
 */
interface A{
	public void aF();
	public interface B{
		public void bF();
	}
	public class C implements A, B{

		@Override
		public void bF() {}

		@Override
		public void aF() {}
	}
}

注:放到接口中的任何类都自动地是public和static的,所以以上内部类实际上静态内部类。


五:方法中定义内部类(局部内部类)

interface In{
	public int print();
}
class Out{
	private int outVar = 0;
	
	public In inClass(){
		final int var = 1;					//必须定义为常量才能被局部内部类访问
		class InImpl implements In{			//局部内部类不能有访问修饰符
			public int print(){
				return outVar + var;
			}
		}
		return new InImpl();
	}
}
测试:

public static void main(String[] args) {
		
		Out out = new Out();
		In  in = out.inClass();
		System.out.println(in.print());
	}

内部类分为局部内部类(方法内定义)、成员内部类、匿名类以及静态内部类。

内部类形成一个闭包,能直接访问定义它环境的资源,包括private成员,但是它的外围不能直接访问它的成员,必须通过它的引用才能访问内部类成员。

内部类之所以能访问外围类的所有资源,是因为在创建内部类(非静态)的时候,把外围类的引用隐式地传入了内部类。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值