精华内容
下载资源
问答
  • java内部类访问局部变量时局部变量必须声明为final,同样,在线程中使用局部变量时,需将局部变量声明为final。 public class Thread2 { private static int num = 0; public static synchronized void print...

    java内部类访问局部变量时局部变量必须声明为final,同样,在线程中使用局部变量时,需将局部变量声明为final。

    public class Thread2 {
    
        private static int num = 0;
    
        public static synchronized void printNum(String tag){
            try {
                if(tag.equals("a")){
                    num = 100;
                    System.out.println("tag a ,set num over");
                }else {
                    num = 200;
                    System.out.println("tag b ,set num over");
                }
                System.out.println("tag"+tag + "num:"+num);
            }catch (Exception e){
                e.printStackTrace();
            }
    
        }
    
    
        public static void main(String[] args) {
    
            //两个不同对象
            final Thread2 m1 = new Thread2();
            final Thread2 m2 = new Thread2();
    
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    m1.printNum("a");
                }
            });
    
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    m2.printNum("b");
                }
            });
    
            t1.start();
            t2.start();
    
        }
    }

    原因:
    编译这个类后发现产生了3个class文件,编译后的内部类的构造方法的里面,传了对应的外部类的引用和所有局部变量的形参。
    由于这些工作是在编译时进行的,JAVA虚拟机并没有什么所谓的内部类的概念,在JAVA虚拟机看来,该内部类和外部类是两个独立的class文件。
    final关键字的目的就是为了保证内部类和外部函数对变量“认识”的一致性

    展开全文
  • 在解释全局变量和局部变量之前,先说一个js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。如何查找全局变量 最外层的函数和和最外层函数外面的变量都是全局变量。因为函数是可以嵌套...

    在解释全局变量和局部变量之前,先说一个js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。

    如何查找全局变量

    1. 最外层的函数和和最外层函数外面的变量都是全局变量。

      因为函数是可以嵌套的,所以找全局变量时,要找最外层函数;而且函数本身也是一个变量,特殊变量,其名字就是变量名。

    2. 没有用 var声明的变量,为全局变量,即使位置在函数体内部。

    3. 所有Window对象的属性也是全局变量。
     var v = "hello"; //函数体外的变量,全局变量
     var a = 100 
         b = 10; //b也是全局变量
        function test (){
        v="11";  //没有用var声明的变量,全局变量
            console.log(v);
            var v = "world"; //函数体内部的变量,局部变量
        }
        test();

    详细解释,各种情况

     var v = "hello";
        var a = 100
        b = 10;
        console.log(a);
    
        function test() {
            console.log(b);
            var v = "world";
        }
        test();
    1. var a = 100
      b = 10;

      连续赋值,等同于 var a=100; b=10; b为没有var声明的全局变量 。元素中间用换行, 不然要报Uncaught SyntaxError: Unexpected identifier。

    2. 没有用var定义的全局变量,作用1、是为声明定义过的变量,重新赋值;不管是全局变量,还是局部变量。2、作为定义的变量。位置不管在全局或者局部,在局部时,一定要在输出(使用)前,定义好。(个人理解,如果读者有更好的了解或者觉得我的解释有误,可以留言)

    这里写图片描述

    1. 函数内部的this指针指向,调用函数的调用者。
        var v = "hello";
        function test() {
            var v = "world";
            console.log(this.v);
        }
        test();

    输出结果是hello。test()函数在此列子中为全局变量,所以调用它的为window,this.v等同于window.v。输出时,会去查找,属于window的变量。 var v = “hello”;为全局变量是属于window的。

    知识点提升
    变量和函数的声明提升:也叫预解析机制

        var v = "hello";
        function test (){
            console.log(v);
            var v = "world";
        } 
        //上述代码等同于
            var v = "hello";
            function test (){
            var v;  //提升变量声明
            console.log(v);
            v = "world";
        }
    

    所以输出是undefined。

    变量的提升:js执行过程中,遇到变量,会将变量声明提升到函数的第一行,只是提升声明,而不能赋值。

    在代码中是禁止出现单独的元素变量的:var a=1;或者是a=1;或者是var a是可以的;但 绝对不能单独出现 a。前面两种是已经声明,并有确定的值。

    var a;是定义了,但没有赋值,输出时会输出undefined。而单独出现的a,直接报test.html:18 Uncaught ReferenceError: a is not defined。这两者是不一样的,undefined是数据类型,而后者是活生生的错误。

        <script>
        var v = "hello";
        function test() {  
            v = "world";
            console.log(v);
            var v = "gaega";
            console.log(test1());
            function test1() {
                return 2;
            }
        }
        test();
        </script>

    这里写图片描述

    输出为:world,2

    函数的声明提升:执行js代码时,预解析机制,会将代码中的所有函数按照包裹关系列出来,只是我们不知道而已。当调用时,再去查,是否定义了该函数。如果定义了,就执行函数;没有定义就报错。强调强调:预解析时只是知道有该函数,而不去执行该函数。所以在js中,调用语句可以写在函数定义之前。这种情况在其他语言中是没有的。

    补充:
    在js中是允许用相同的变量名的,这种情况在其他语言中是没有的。

     <script>
        var v = "hello";
    
        function test() {
            var v = "11";
            console.log(v); //输出11
            v = "33";
            var v = "22";
            console.log(v);  //输出22
    
        }
        test();
        </script>

    变量赋值是从左到右的:

        <script>
        var a = 100;
    
        function test() {
            var a = 10;
            a = 1;
            console.log(a);
        }
        test();
        </script>

    上述代码的执行步骤:

    1. var a;
    2. a=100;
    3. test();
    4. 进入函数体内
    5. var a;
    6. a=10;
    7. 当执行a=1;之前a都为10;
    8. a=1;
    9. console.log(a);

    在Google 中调试代码,观察代码执行顺序

    调试代码

    展开全文
  • var 声明变量,也可以不使用var 这样定义的就是全局变量,js解释器执行时首先在全局构建一个全局对象,我们写的全局变量就是为这个全局对象做准备的,就是为了该对象的属性读取,可以使用this ,window,使用这个变量...
     JS 中使用 var 声明变量,也可以不使用var 这样定义的就是全局变量,js解释器执行时首先在全局构建一个全局对象,我们写的全局变量就是为这个全局对象做准备的,就是为了该对象的属性读取,可以使用this ,window,使用这个变量,而对于局部变量,js 局部方法执行完,局部变量就会销毁,我们可以从此优化,优化内存的使用量
    
    function outPut(s){ 
    document.writeln(s) 
    } 
    //全局变量 
    var i=0; 
    //定义外部函数 
    function outer(){ 
    //访问全局变量 
    outPut(i); // 0 
    //定义一个类部函数 
    function inner(){ 
    //定义局部变量 
    var i = 1; 
    // i=1; 如果用隐式申明 那么就覆盖了全局变量i 
    outPut(i); //1 
    } 
    inner(); 
    outPut(i); //0 
    } 
    outer(); 
    </SCRIPT
        在方法执行完成之后,局部变量被销毁,全局变量又恢复初值
    
    展开全文
  • 今天在看AWT的事件处理机制的时候,突然对局部内部类中访问局部变量的情况有了一点小好奇,因为在java中规定,局部内部类访问外部类中方法的局部变量时,该局部变量必须定义为final。百度了老半天,发现说的都挺模糊...

    今天在看AWT的事件处理机制的时候,突然对局部内部类中访问局部变量的情况有了一点小好奇,因为在java中规定,局部内部类访问外部类中方法的局部变量时,该局部变量必须定义为final。百度了老半天,发现说的都挺模糊的,结合查到 的结果再想了老半天,突然有所体会,现在将我认为合理的理由阐明如下,如有错误,还望各位大虾们给以纠正啊,呵呵。。。。。

    首先来看一段代码:

    public class MainClass {
    
    	public static void main(String[] args) {
    		A2 a2 = new A2();
    		A1 a1 = new A1();
    		a2.test(a1.getA1());
    
    	}
    
    }
    
    class A1 {
    	public void show() {
    	}
    
    	public A1 getA1() {
    		final int variable = 10;
    		class A2 extends A1 {
    			public void show() {
    				System.out.println(variable);
    			}
    		}
    
    		return new A2();
    	}
    }
    
    class A2 {
    
    	public void test(A1 a) {
    		a.show();
    	}
    }


    以上代码的输出结果是:10

    流程如下:

    先调用a1对象的getA1()方法,该方法返回一个A1类的子类(A2类),返回的A2类,作为a2.test(A1 a)方法的参数,在test方法中,再调用A2类中的show方法,输出variable变量的值。


    仔细观察代码会发现一个奇怪的现象:在调用完getA1()方法之后,该方法内部定义的variable变量的内存单元应该已经被清空,可是getA1()方法的返回值A2对象,却在test方法中调用的show方法中再次使用了variable变量,这个看起来是不是怪怪的呢,这里的variable变量难道就是原来那个应该被清空的variable变量?

    以上出现的情况即为:局部内部类的生命周期可能比其使用的局部变量的生命周期要长

    所以为了保证在局部内部类中使用的局部变量不会找不到值(即即使局部变量被清空了还能访问到值),则必须将局部变量“拷贝”一份到局部内部类中作为自身的内部变量(这部分工作由编译器完成),这样局部内部类访问的局部变量实际上是访问自身的内部变量,这样即使原来的局部变量的内存单元被清空了,局部内部类依然可以使用局部变量的值(已经拷贝到内部类中)。

    这里可以得出一个重要的结论:即局部内部类中使用的局部变量实际上是"拷贝"后的变量


    在这个结论的作为条件的前提下,再接下来的分析:

    现在换一种常见的情况进行分析,即局部内部类的声明周期短于局部变量的生命周期(大部分情况应该都属于这种)

    如果是这种情况,那么可能出现在内部类中对变量进行更改后(实际的更改是拷贝后的那份变量了,所以对原来的变量并不会产生影响)在方法中会再一次使用这个变量,此时就会出现数据的不一致性,即不管内部类中对变量如何更改,因为其更改的始终是拷贝的那份变量,所以外部类的局部变量将一直保持不变,为了避免这种不符合逻辑的情况出现,所以java规定局部内部类使用的局部变量必须为final,这样内部类“拷贝”的那份也定义为final变量,即不可更改,这样就避免了在内部类中对变量进行更改,这样内部类和外部类的局部都不能对变量进行更改,也就避免了非逻辑情况的出现。

    展开全文
  • 对于 JavaScript 中的全局变量和局部变量,分为隐式声明和显示声明。 全局变量 1.使用 var 关键字在函数外部声明的变量,为全局变量(显示声明) 2.在函数内部,没有使用 var 声明的变量,也为全局变量(隐式声明) ...
  • 本文对C#中的一些变量声明和范围关系借几个demo展示出来。 情况一:变量包含产生歧义 ####### 根据变量的作用域遵循的原则(局部变量存在于声明该变量的块语句或方法结束的右花括号({})之前的作用域内),第一个变量...
  • Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非 local 显式声明局部变量局部变量的作用域为从声明位置开始到所在语句块结束。 变量的默认值均为 nil a =5 local b=5 fun...
  • 2、全局变量不能var 声明var 声明的变量是局部变量 3、全局变量可以在声明的函数外调用,局部变量不能再函数外调用。 代码说明: 声明变量 /* var width; //1、声明变量 width=10; //2、给变量...
  • static声明局部变量

    2013-06-15 16:21:56
    有时候声明函数中的局部变量的值在函数调用结束后...这时就应该指定该局部变量为“静态局部变量”,关键字static进行声明。例如: #include void main() {  int f(int a);  int a=2,i;  for(i=0;i  print
  • 全局变量和局部变量的区别在于作用域,全局变量在整个py文件中声明,全局范围内可以使用局部变量是在某个函数内部声明的,只能在函数内部使用,如果超出使用范围(函数外部),则会报错。 #!/usr/bin/python3 # ...
  • C++static声明静态局部变量 在C++中,有时会希望函数中局部变量的值在函数调用结束后不消失,而保留原来的值。 也就是其占用的存储单元不释放,在下一次调用该函数时,这个变量还保留上一次函数调用结束时的值,这是...
  • Java 局部变量

    千次阅读 2018-11-11 19:55:38
    局部变量声明在方法、构造方法或者语句块中; 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁; 访问修饰符不能用于局部变量; 局部变量只在声明它的方法、构造方法...
  • 那么JavaScript中全局变量和局部变量具体是什么?有什么用?下面本篇文章就来给大家介绍一下JavaScript中全局变量和局部变量,希望对大家有所帮助。 局部变量 使用JavaScript时,局部变量是在函数中定义的变量。它们...
  • java方法内局部变量声明必须赋值,否则会报错
  • 使用static声明局部变量的生存期

    千次阅读 2016-03-24 16:19:19
    static声明局部变量,在程序执行前就产生,存放在内存的静态存储区,只能被赋值一次,生命周期为整个程序,而不是从声明处开始。 它与全局变量的区别在于可见性:全局变量为文件作用域,而static局部变量只在定义...
  • 我们都知道方法中的匿名/局部内部类是能够访问同一个方法中的局部变量的,但是为什么局部变量要加上一个final呢? 首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建,当...
  • 什么java内部类访问局部变量必须声明为final?

    千次阅读 多人点赞 2018-01-20 05:19:35
    编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必须声明为final [java] view plain copy package test;    public class ThreadTest {     public void ...
  • int i=1; Runnable r=()->System.out.println(i); 先来说下什么是事实上的final。 如果我声明了一个变量,且在后面不更改它的值,那么那就是事实上的final。...如果i是局部变量,那么会编译出错。为什么 我们知...
  • 1、成员变量(全局变量)是可以不经初始化的,在类加载过程的准备阶段即可给它赋予默认值,但局部变量使用前需要显示赋予初始值,javac不是推断不出不可以这样做,而是没有这么做,对于成员变量而言,其赋值和取值...
  • 新手小白学 JAVA 方法 局部变量 成员变量

    万次阅读 多人点赞 2021-04-01 23:59:30
    2.2 局部变量 位置:定义在方法里或者局部代码块中 注意:必须手动初始化来分配内存.如:int i = 5;或者int i; i = 5; 作用域:也就是方法里或者局部代码块中,方法运行完内存就释放了 2.3 成员变量 位置:定义在类里方法...
  • 局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,即只有在本函数内才能使用它们,在此函数外是不能使用这些变量的,这样的变量成为局部变量局部变量的特点: (1)主函数main中定义的...
  • 全局变量和局部变量

    2017-08-08 08:58:59
    变量作用域确定可在程序中按变量名访问该变量的区域(变量的使用范围:变量声明在哪就决定了使用范围) 全局变量和局部变量的区别: 1.作用域不同 局部变量的作用域仅限于定义它的方法 成员变量的作用...
  • 2.局部变量声明提前:  因为没有块级作用域,所以 js 里局部变量的声明会提前到函数最开始的地方(但是初始化不会提前,切记); 3. js 允许变量重复声明: 同一个作用域上的相同的变量名,后者会覆盖前者;不同...
  • 全局变量和局部变量重名,并带有变量声明提升 一、定义全局变量和局部变量,变量名都是age。在函数内部不对局部变量age赋值 var age = 250;//定义一个全局变量age,赋值为250 function testf(){ console.log(&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 351,223
精华内容 140,489
关键字:

局部变量用什么声明