局部内部类Local Classes

局部内部类一般定义在一个方法或者一个作用域中,其作用域也只能在该方法或作用域中,可以无限制调用外部类的方法和属性。局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的,但能使用abstract定义为一个抽象类。

为保证数据一致性,内部类只能访问被final修饰的局部变量。在JDK8以后可以不用加(effectively final语法糖,编译器会自动加final),但是如果在局部类中改变了该变量的值,则effectively final失效,编译不能通过。

public class Outer{
	private int num;

	Outer(int num){
		this.num = num;
	}

	public void printer(){
		int count = 0; 
		class Inner{	
			public void print(){
				System.out.println("Inner:"+num); //可以无限制访问外部类成员
				// count = 1; 编译出错,count必须为final或者effectively final
				System.out.println("Inner:"+count); //内部类只能访问被final修饰的局部变量
			}
		}
		System.out.println("Outer:"+num);
		Inner inner = new Inner();
		inner.print();	//作用域为printer()	
	}
}

Think in java
使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

java中是不能实现多继承的,接口也正是为了对多继承的补充完善给出的方案。而我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值