局部内部类一般定义在一个方法或者一个作用域中,其作用域也只能在该方法或作用域中,可以无限制调用外部类的方法和属性。局部内部类就像是方法里面的一个局部变量一样,是不能有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中是不能实现多继承的,接口也正是为了对多继承的补充完善给出的方案。而我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。