内部类(2)

局部内部类:顾名思义,在对象的方法成员内部定义的类。

定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
  像局部变量一样,不能被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局部变量"复制"一份,复制品直接作为局部内部类中的数据成员(即外部类的变量被作为构造方法的参数传给了内部类的私有成员.).这样:当局部内部类访问局部变量时,其实真正访问的是这个局部变量的"复制品"(即:这个复制品就代表了那个局部变量).因此:当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(其实访问的是"复制品"),给人的感觉:好像是局部变量的"生命期"延长了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值