局部内部类:顾名思义,在对象的方法成员内部定义的类。
定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
像局部变量一样,不能被public, protected, private和static修饰。
只能访问方法中定义的final类型的局部变量。
方法内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成方法内部类的实例并且调用其方法
package test10;
public class Outer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 成员内部类
* @author admin
*
*/
public String inner(String s){
class Inner{
private String str=s;
public String print(){
name="jack"; //使用外部类的成员变量
//s="hello"; java8之前,s 需要显式的声明为final ,而在java中中默认s是final的
System.out.println(str);
return name;
}
}
Inner inner = new Inner();
return inner.print();
}
public Outer() {
super();
}
public Outer(String name) {
super();
this.name = name;
}
public static void main(String[] args) {
Outer outer = new Outer();
System.out.println(outer.inner("Tom"));
}
}
java 8之前,局部内部类访问同一个方法中的局部变量,却必须要加上一个final,java8之后,可以不显式的加final ,但是变量值不能被更改。
局部变量为什么必须用final修饰呢?
内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才能死亡。所以完全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。
这时:出现了一个"荒唐"结果:局部内部类对象要访问一个已不存在的局部变量i!
当变量是final时,通过将final局部变量"复制"一份,复制品直接作为局部内部类中的数据成员(即外部类的变量被作为构造方法的参数传给了内部类的私有成员.).这样:当局部内部类访问局部变量时,其实真正访问的是这个局部变量的"复制品"(即:这个复制品就代表了那个局部变量).因此:当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(其实访问的是"复制品"),给人的感觉:好像是局部变量的"生命期"延长了.