精华内容
下载资源
问答
  • 局部内部类访问局部变量的注意事项? A:局部内部类访问局部变量必须用final修饰 B:为什么呢? 局部变量是随着方法的调用而调用,随着调用完毕而消失。 而堆内存的内容并不会立即消失。所以,我们加final...
    /*
    	局部内部类
    		A:可以直接访问外部类的成员
    		B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
    	
    	面试题:
    		局部内部类访问局部变量的注意事项?
    		A:局部内部类访问局部变量必须用final修饰
    		B:为什么呢?
    			局部变量是随着方法的调用而调用,随着调用完毕而消失。
    			而堆内存的内容并不会立即消失。所以,我们加final修饰。
    			加入final修饰后,这个变量就成了常量。既然是常量。你消失了。
    			我在内存中存储的是数据20,所以,我还是有数据在使用。
    */
    class Outer {
    	private int num  = 10;
    	
    	public void method() {
    		//int num2 = 20;
    		//final int num2 = 20;
    		class Inner {
    			public void show() {
    				System.out.println(num);
    				//从内部类中访问本地变量num2; 需要被声明为最终类型
    				System.out.println(num2);//20
    			}
    		}
    		
    		//System.out.println(num2);
    		
    		Inner i = new Inner();
    		i.show();
    	}
    }
    
    class InnerClassDemo5 {
    	public static void main(String[] args) {
    		Outer o = new Outer();
    		o.method();
    	}
    }

    展开全文
  • 局部内部类访问局部变量的注意事项 A:局部内部类访问局部变量必须用final修饰 B:为什么呢? 因为局部变量会随着方法的调用而调用,随着调用完毕而消失。 而堆内存的内容并不会立即消失。所以,我们加final...
    /*
    	局部内部类:
    		A:可以直接访问外部类的成员
    		B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。
    	
    	面试题:
    		局部内部类访问局部变量的注意事项
    		A:局部内部类访问局部变量必须用final修饰
    		B:为什么呢?
    			因为局部变量会随着方法的调用而调用,随着调用完毕而消失。
    			而堆内存的内容并不会立即消失。所以,我们加final修饰
    			加入final修饰后,这个这变量就成了常量。既然是常量。你消失了。
    			我在内存中存储的是数据20,所以,我还是有数据在使用。
    */
    package cn.Inner5;
    
    class Outer{
    	private int num = 10;
    	
    	
    	
    	public void method(){
    		//int num2 = 20;
    		final int num2 = 20;
    		
    		class Inner{
    			public void show(){
    				System.out.println(num);
    				//从内部类中访问局部变量 num2;需要被声明为最终类型
    				//System.out.println(num2);//20
    			}
    		}
    		//System.out.println(num2);
    		
    		Inner i = new Inner();
    		i.show();
    	}
    }
    
    class InnerClassDemo5{
    	public static void main(String[] args){
    		Outer o = new Outer();
    		o.method();
    	}
    }

    展开全文
  • * 局部内部类访问局部变量必须用final修饰* 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么? 因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,...

    * 局部内部类访问局部变量必须用final修饰
    * 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
    因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用

    1.8之前的版本是需要加final,1.8之后不用加也可以使用。

    public class Demo2_InnerClass {
        public static void main(String[]args){
            Outher o=new Outher();
            o.method();
        }
    }
    
    class Outher{
        public void method(){
            int num=10;
            class Inner{
                public void print(){
                    System.out.println("局部内部类成员方法");
                    System.out.println("访问局部变量需要设置为final:"+num);
                }
            }
            Inner i=new Inner();//在方法中创建Inner对象
            i.print();
        }
       /* public void run(){//局部内部类,只能在其所在的方法中访问
            Inner i=new Inner();
            i.print();
        }*/
    }

     

    展开全文
  • 我们都知道方法中的匿名/局部内部类是能够访问同一个方法中的局部变量的,但是为什么局部变量要加上一个final呢? 首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建,当...

    我们都知道方法中的匿名/局部内部类是能够访问同一个方法中的局部变量的,但是为什么局部变量要加上一个final呢? 

    首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建,当方法调用结束时(执行完毕),退栈,这些局部变量就会死亡。但是内部类对象是创建在堆中的,其生命周期跟其它类一样,只有当jvm用可达性分析法发现这个对象通过GCRoots节点已经不可达,然后进行gc才会死亡。

    所以完全有可能存在的一个现象就是一个方法已经调用结束(局部变量已死亡),但该内部类的对象仍然活着,也就是说内部类创建的对象的生命期会超过局部变量,这就会出现内部类的对象要访问局部变量时访问失败,而java为了保证这种情况不会发生,就用了一种折中的方案:内部类要访问局部变量,局部变量必须加final,那为什么局部变量定义成final就可以了呢?

    然后我们再来看final这个关键字修饰变量的特点:当final修饰一个基本数据类型的变量时,这个基本类型的变量在初始化的时候就应该赋值,并且初始化完成之后其值就不能再发生改变了;当final修饰一个引用类型的变量时,这个引用类型的变量在初始化的时候就应该赋值并且之后不能再发生改变,但是引用类型的变量指向的对象的堆内存的值是可以改变的。

    基于final修饰变量的以上两个特点,java就把局部内部类对象要访问的final型局部变量,复制过来变成该内部类对象中的一个成员变量,这样即使栈中局部变量(含final)已死亡,但由于它是final的,其值是不会发生改变的,因而内部类对象在局部变量死亡后,照样可以访问自己内部维护的一个值跟局部变量一样的成员变量,从而解决这个问题。

    ps:java8中匿名/局部内部类访问局部变量时,局部变量已经可以不用加final了,但其实这个局部变量还是final的,只不过不用显式的加上而已,推测可能是编译机制发生了改变。

    展开全文
  • Java 局部内部类访问局部变量为什么必须加final关键字 疑问 在Java中,局部内部类如果调用了方法中的变量,那么该变量必须申明为final类型,如果不申明,则编译就会出错。 这里的内部类指的是方法内部类或匿名内部...
  • 局部内部类访问局部变量细节

    千次阅读 2015-09-13 21:12:20
    class People //file InnerClassTest.java { private int a = 21; public void method() { String go = "running ... //局部变量 class Hand //局部内部类 { public void show() { System.out.print
  • 这里说的事局部内部类,不是普通静态内部类和非静态内部类,因为他们不能访问方法体内的局部变量。 java要求所有被局部内部类访问局部变量都是用final修饰是因为:对于普通局部变量他的作用域就是该方法内,当...
  • 因为生命周期不一致, 局部变量直接存储...而局部内部类局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。 ...
  • JAVA用了也快三年了,内部类访问局部变量的情况也没少遇到。也一直知道要给变量加个final修饰符,不然通过不了编译。但一直也没深究过为什么要加。昨天好奇的上网查了下,并翻阅了下相关的书籍(Core Java 8th),...
  • 就会随之销毁,但是我的内部类对象可能仍然还存在的(当不在被使用才会被垃圾回收器回收)这时在内部类访问局部变量x,但此时的x已经被销毁,内部类访问了一个并不会存在的变量,这就形成了一个矛盾。...
  • 在之前的版本中内部类访问局部变量(指qq)必须添加final符修饰,但在jdk1.8中不用添加final修饰符即可通过编译。 这实际上是因为该版本的jdk中帮我们隐式地添加了final 修饰符,可在内部类添加qq = new QQ()验证...
  • 因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更广的生命周期,下面通过一个实例加以说明: 如例中所示,在外部Outer中声明了...
  • 今天在看AWT的事件处理机制的时候,突然对局部内部类访问局部变量的情况有了一点小好奇,因为在java中规定,局部内部类访问外部中方法的局部变量时,该局部变量必须定义为final。百度了老半天,发现说的都挺模糊...
  • 内部类访问局部变量,编译器实际上会为该内部类创建一个成员变量, 以及带有参数的构造方法,然后将该变量传入构造方法,也就是说外面的 变量和里面的变量就是名字相同而已,此时你无论修改哪一个都对另外 ...
  • 这里的局部变量就是在方法中的变量,能访问方法中变量的当然也是局部内部类了。 我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的。例如下面的代码: ...
  • 为什么java内部类访问局部变量必须声明为final?

    千次阅读 多人点赞 2018-01-20 05:19:35
    编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必须声明为final [java] view plain copy package test;    public class ThreadTest {     public void ...
  • 当使用匿名内部类的时候,如果匿名内部类需要访问匿名内部类所在方法中的局部变量的时候,必须给局部变量加final进行修饰。不加final修饰的局部变量,匿名内部类访问不到的。这是为什么呢?网上有两种说法,第一种...
  • 但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部中的方法处在同一个等级上,外部中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。...
  • 这里的局部变量就是在方法中的变量,能访问方法中变量的当然也是局部内部类了。 我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的。例如下面的代码: ...
  • 首先要明白: 一个完整的Java程序运行过程会涉及以下内存区域:  寄存器:JVM内部虚拟寄存器,存取速度... 栈:保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存的实例,即堆区对象的引用(指针
  • 为了说明内部类访问局部变量为什么要加 final 关键字,我们先来看一下JAVA对内部类的实现。 假设上述代码中 start 函数所在的的名称为 TalkingClock 。则编译上述代码的时候,JAVA编译器会把 TimePrinter ...
  • 在书上看到这样一段话:如果局部内部类访问外部局部变量,则此变量必须是final修饰的,否则不能访问。说是为了提高局部变量的生命周期,可不可以说的通俗一些?
  • Java匿名内部类访问外部局部变量,那么这个局部变量需要用final修饰吗? 为什么我的测试没有用final却可以?
  • Java匿名内部类使用局部变量

    千次阅读 2017-03-04 17:29:01
    在Java8之前,我们在匿名内部类或者局部内部类中使用局部变量都需要将局部变量声明为final,这是因为java底层给我们做了一些小动作,匿名内部类表面上没有构造函数,其实是有的,底层直接将局部变量通过构造函数传给...
  • 这里所说的“匿名内部类”主要是指在其外部的成员方法内定义,同时完成实例化的,若其访问该成员方法中的局部变量局部变量必须要被final修饰。 原因是编译程序实现上的困难:内部类对象的生命周期会超过局部...
  • (1)....内部类不能访问外部方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。这是因为局部变量的生命周期原因。 class Outer{ private int a; public class Inner{
  • 关于内部类的问题: 局部内部类访问外部局部变量问题 编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必须声明为final [java] view plain copy package test; public class ThreadTest { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,364
精华内容 92,945
关键字:

内部类访问局部变量