前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA变量的作用域

JAVA变量的作用域

作者头像
逆回十六夜
修改2019-08-07 16:28:52
1.2K0
修改2019-08-07 16:28:52
举报
文章被收录于专栏:逆回十六夜逆回十六夜

转载自:

http://www.cnblogs.com/AlanLee/p/6627949.html

https://www.cnblogs.com/CodingAndRiding/p/7456347.html

https://blog.csdn.net/weixin_40995778/article/details/83026670

大多数程序设计语言都提供了“作用域”(Scope)的概念。

对于在作用域里定义的名字,作用域同时决定了它的“可见性”以及“存在时间”。在C,C++和Java里,作用域是由花括号的位置决定的。

Java用一对大括号作为语句块的范围,称为作用域,作为在作用域里定义的一个变量,它只有在哪个作用域结束之前才可使用。

代码语言:javascript
复制
public static void main(String[] args){
    int x = 1;
    int y = 2;
    {
        //int x = 3;
        int z = 4;
        System.out.println(x);
    }
    //z = y;
}
x在作用域已经定义,不允许重复定义
x在作用域已经定义,不允许重复定义
z超出了以花括号的作用域,因而无法被解决
z超出了以花括号的作用域,因而无法被解决
代码语言:javascript
复制
public static void main(String[] args){
    {
        int x = 1;
        System.out.println(x);
    }
    int x =2;
    System.out.println(x);
}

java变量的定义是有先后顺序之分的
java变量的定义是有先后顺序之分的

离开作用域,变量所分配的内存空间将被JVM回收,所以语法不会有错误,而第1种写法x并没有离开{}作用域,所以会语法错误。

上述的变量都是局部变量,那么如果是在有成员变量的情况下又是怎样一种结果呢?我们来用代码说话,代码如下:

代码语言:javascript
复制
public class Test {
    String name = "Van";

    public static void main(String[] args){
        {
            String name = "bili";
            System.out.println(name);
        }
        String name = "muji";
        System.out.println(name);
    }
}

大家仔细的观察并结合代码思考,可以得出变量的作用域结论如下:  在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局部变量不可以变量名相同(作用域内不能重复命名),在方法中使用变量的时候如果不指明使用成员变量还是局部变量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,那么则可以重复命名此变量,并使用最新定义的这个局部变量。
大家仔细的观察并结合代码思考,可以得出变量的作用域结论如下: 在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局部变量不可以变量名相同(作用域内不能重复命名),在方法中使用变量的时候如果不指明使用成员变量还是局部变量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,那么则可以重复命名此变量,并使用最新定义的这个局部变量。

对象的作用域

Java对象不具备与主类型一样的存在时间。用new关键字创建一个Java对象的时候,它会超出作用域的范围之外。所以假若使用下面这段代码:

代码语言:javascript
复制
1 {
2     String s = new String("a string");
3 } /* 作用域的终点 */

那么句柄s,也就是引用会在作用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,我们没有办法继续使用这个对象,因为指向它的唯一一个句柄已经超出了作用域的边界。

这样造成的结果是:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C和C++里特别突出。在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,所以在需要对象的时候,根本无法确定它们是否可用。而且最麻烦的是,在C++里,一旦完成工作,必须保证将对象手动清除。

这样便带来了一个有趣的问题。假如 Java 让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”呢。在 C++里,这个问题最令程序员头痛。但 Java 以后,情况却发生了改观。 Java 有一个特别的“垃圾收集器”,它会查找用 new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地创建对象,一旦不再需要它们,它们就会自动离去。这样做可防止在 C++里很常见的一个编程问题:由于程序员忘记释放内存造成的“内存溢出”。

成员变量的4种作用域对比:

public。表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直接访问。

private。表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外的其他类或者对象都没有访问权限。

protected。表明该成员变量或方法对自己及其子类是可见的,即自己和(同包和不同包)子类具有权限访问。除此之外的其他类或者对象都没有访问权限。

default。表明该成员变量或方法只有自己和与其同一包内的类可见。

注意:

这些修饰符只能修饰成员变量,不能用来修饰局部变量。private和protected不能用来修饰类。(只有public、abstract或final能用来修饰类)

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 转载自:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档