Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 中变量的作用域

Java 中变量的作用域

作者头像
技术从心
发布于 2019-08-06 08:16:15
发布于 2019-08-06 08:16:15
2.2K00
代码可运行
举报
文章被收录于专栏:技术从心技术从心
运行总次数:0
代码可运行

一、开头

变量的作用域是一个程序的重要组成部分。因为它决定了某个时候每个地方某个变量是否可访问。与 C/C++ 一样。静态语言的作用域在编译期就是确定的。而且独立于函数调用堆栈。

类 ( class ) 是 Java 程序的基本组成单元。而类又通过 包 ( package ) 来组织。因此 Java 中的作用域可以分为以下几个部分。

二、成员变量 ( 类级作用域 )

成员变量 就是 Java 中的变量 中所提到的 实例变量 。也就是说,成员变量 是定义在类中的,而又在任何方法之外的变量。

成员变量 在类的任何位置都可以直接访问。

比如下面这个类 JavaTester.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaTester
{
    // 所有在类中定义的非静态变量都是成员变量
    int a;
    private String b
    void method1() {....}
    int method2() {....}
    char c;
}

成员变量 可以在类的任何位置声明和定义,但必须位于方法之外。

成员变量 前的 访问修饰符 规则并不适用于在类的内部访问。

而在类的外部,成员变量的可见性( 可访问性 )则由访问修饰符决定。并且遵循以下规则

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
访问修饰符          包   子类  全局
public             是    是    是
protected          是    是    否private            否    否     否
默认(无修饰符)      是    否    否

三、局部变量 ( 方法级别作用域 )

在方法内部声明的变量,嗯,就是局部变量,只限于方法级别的作用域。也就是说,局部变量在方法外部是无法访问的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JavaTester.java
public class JavaTester
{
    void run() 
    {
       // 局部变量 ( 方法级别作用域 )
       int x;
    }
}

注意:当方法执行结束,局部变量也会随之销毁。也就是说在方法外部,局部变量就不存在了。

下面是方法作用域的另一个范例,在这个实例中,变量 x 是方法的一个参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaTester
{
    private int x;
    public void setX(int x)
    {
        this.x = x;
    }
}

上面这段代码中,我们使用 this 关键字来区分局部变量和实例变量。

作为一个练习,你能说出下面程序的执行结果吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JavaTester.java
public class JavaTester 
{ 
    static int x = 11; 
    private int y = 33; 
    public void run(int x) 
    { 
        JavaTester t = new JavaTester(); 
        this.x = 22; 
        y = 44; 

        System.out.println("Test.x: " + JavaTester.x); 
        System.out.println("t.x: " + t.x); 
        System.out.println("t.y: " + t.y); 
        System.out.println("y: " + y); 
    } 

    public static void main(String args[]) 
    { 
        JavaTester t = new JavaTester(); 
        t.run(5); 
    } 
}

我们运行下上面的代码,看看输出结果如何

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
Test.x: 22
t.x: 22
t.y: 33
y: 44

四、循环变量 ( 块级作用域 )

大括号 { 和 } 内声明的变量的作用域仅限于该大括号 {} 内部。

例如下面的代码,变量 x 的作用域仅限于离它最近的大括号 {}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JavaTester.java
public class JavaTester 
{ 
    public static void main(String args[]) 
    { 
        { 
            // 变量 x 的作用域仅限于离它最近的大括号
            int x = 10; 
            System.out.println(x); 
        } 

        // 如果你把下一行代码的注释去掉,会抛出一个异常

        // System.out.println(x);  
    } 
}

编译运行以上代码,输出结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
10

如果把最后一行的注释去掉,则会发生编译错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
JavaTester.java:13: 错误: 找不到符号
        System.out.println(x);  
                           ^
  符号:   变量 x
  位置: 类 JavaTester
1 个错误

五、循环中的作用域

循环中声明的变量的作用域范围仅限于该循环的大括号 {}。

例如下面的代码,变量 x 的作用域仅限于 for 循环中的大括号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JavaTester.java
public class JavaTester 
{ 
    public static void main(String args[]) 
    { 
        for (int x = 0; x < 4; x++) 
        { 
            System.out.println(x); 
        } 

        // 抛出错误 
        // System.out.println(x); 
    } 
}

运行结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
0
1
2
3

如果把注释去掉,编译时会产生一个错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
JavaTester.java:11: 错误: 找不到符号
        System.out.println(x); 
                           ^
  符号:   变量 x
  位置: 类 JavaTester
1 个错误

如何修复这个错误 ?

最佳的办法时把变量 x 的声明移到 for 循环之外,就像下面这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaTester 
{ 
    public static void main(String args[]) 
    { 
        int x = 0;
        for (; x < 4; x++) 
        { 
            System.out.println(x); 
        } 

        // 抛出错误 
        System.out.println(x); 
    } 
}

编译运行上面这段代码,输出结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
0
1
2
3
4

但是,Java 中的 for 循环有一个诡异的地方,看看下面的代码,你知道输出结果是什么吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaTester 
{ 
    public static void main(String args[]) 
    { 
        int x = 0;
        for (int x = 0; x < 4; x++) 
        { 
            System.out.println(x); 
        } 

        // 抛出错误 
        System.out.println(x); 
    } 
}

如果你熟悉 C/C++ ,你一定会感到非常诧异,因为编译的时候报错了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
JavaTester.java:6: 错误: 已在方法 main(String[])中定义了变量 x
        for (int x = 0; x < 4; x++) 
                 ^
1 个错误

同样的,你能猜出下面的代码输出结果是什么吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JavaTester 
{ 
    public static void main(String args[]) 
    { 
        { 
            int x = 5; 
            { 
                int x = 10; 
                System.out.println(x); 
            } 
        } 
    } 
}

运行结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
JavaTester.java:8: 错误: 已在方法 main(String[])中定义了变量 x
                int x = 10; 
                    ^
1 个错误

六、总结

是不是很郁闷。我们总结下 Java 中的作用域的知识点: 通常来说,Java 中的作用域由花括号 {} 来界定。 在同一个花括号范围之内,只要定义了一个变量,就可以在该定义之后访问该变量。而且,一个变量可以在定义之后的任何子花括号作用域内访问。 在类中定义的且在方法之外定义的变量,俗称实例变量,可以在类中的任何方法中访问。 当一个访问内部定义的局部变量和类的实例变量同名时,局部变量会覆盖实例变量,如果要引用实例变量,可以使用 this 关键字。 如果要在循环之后再访问一个变量,则必须在循环之前就定义该变量。

原文链接:https://www.twle.cn/t/441

END

好看、转发和辣条会提升颜值哦~

关注我

每天进步一点点

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA变量的作用域
http://www.cnblogs.com/AlanLee/p/6627949.html
逆回十六夜
2019/07/31
1.5K0
牛客错题总结 2月19日 15点07分
我本来以为执行throw new RuntimeException();程序就会停止,谁知道finally语句执行地非常坚定,无论如何都要执行!
訾博ZiBo
2025/01/06
1000
牛客错题总结 2月19日 15点07分
【JavaSE专栏7】Java 常量、变量及其作用域
Final 修饰的常量定义的语法为 private static final 类型 名称,请看以下代码块:
Designer 小郑
2023/08/01
2240
【JavaSE专栏7】Java 常量、变量及其作用域
【JAVA-Day07】深入了解Java中的常量、变量以及作用域规则
在Java编程中,了解常量和变量以及它们的作用域是非常重要的。本文将深入探讨Java中常量、变量的定义、属性,以及它们的作用域范围,同时提供了丰富的示例代码来帮助您更好地理解Java编程语言。
默 语
2024/11/20
2400
【JAVA-Day07】深入了解Java中的常量、变量以及作用域规则
【JavaSE】作用域
1. 基本使用 [在这里插入图片描述] VarScope public class VarScope { public static void main(String[] args) { Cat1 cat1 = new Cat1(); cat1.hi(); cat1.cry(); cat1.eat(); } } class Cat1{ //全局变量:也就是属性,作用域为整个类体 Cat类:cry eat 等方法使用属性
兮动人
2021/12/31
3630
【IT领域新生必看】解密Java编程:成员变量与局部变量的神秘区别
在Java编程中,变量是存储数据的基本单元。变量的作用域和生命周期决定了它们在程序中的使用方式。成员变量和局部变量是Java中两种常见的变量类型。对于初学者来说,理解它们的区别是掌握Java编程的重要一步。本篇文章将详细介绍成员变量与局部变量的定义、用法及其区别,帮助你全面理解这些概念。
E绵绵
2025/05/25
1550
【Java练习题】Java程序的输出 | 第一套(含解析)
考虑到如果将答案紧接着问题贴出来,同学们可能还没思考就不小心看到了结果,所以我把问题和答案分开放,中间还用东西挡了一下,希望不会给大家带来阅读上的困难
海拥
2021/08/23
3540
【Java练习题】Java程序的输出 | 第一套(含解析)
Java一分钟之变量声明与初始化基础
在Java编程的旅途中,变量声明与初始化是每位开发者必须掌握的基础知识点。它们是构建程序大厦的砖石,直接关系到数据的存储与处理。本文将带你快速深入理解这一基础概念,揭示其中的常见问题、易错点以及如何巧妙避免,通过实例代码让你轻松上手。
Jimaks
2024/05/15
2330
Java一分钟之变量声明与初始化基础
Java基础(七): 面向过程与面向对象、类与对象、成员变量与局部变量、值传递与引用传递、方法重载与方法重写
Java基础(五):流程控制全解析——分支(if/switch)和循环(for/while)的深度指南
Java微观世界
2025/07/17
1020
「JAVA」Java面向对象之final、abstract抽象、和变量生命周期
final是最终、不可修改的意思, 在Java中它可以修饰非抽象类,非抽象方法和变量。但是需要注意的是:构造方法不能使用final修饰,因为构造方法不能够被继承。下面,咱们就来一一看看吧!
老夫编程说
2020/05/13
6900
「JAVA」Java面向对象之final、abstract抽象、和变量生命周期
深度理解Java中的static
static可以用来修饰类的成员方法、类的成员变量、类中的内部类(以及用static修饰的内部类中的变量、方法、内部类),另外可以编写static代码块来优化程序性能。
全栈程序员站长
2022/09/09
2.3K0
Go 代码块与作用域,变量遮蔽问题详解
首先我们从一个 Go 变量遮蔽(Variable Shadowing)的问题说起。
贾维斯Echo
2023/10/18
7120
Go  代码块与作用域,变量遮蔽问题详解
Java基础(8)-Java变量类型
格式说明:type为Java数据类型。identifier是变量名。可以使用逗号隔开来声明多个同类型变量。
joshua317
2021/12/20
5000
Java Review (八、面向对象----成员变量和局部变量)
在Java语言中,根据定义变量位置的不同,可以将变量分成两大类:成员变量和局部变量。成员变量和局部变量的运行机制存在较大差异。
三分恶
2020/07/16
1K0
Java变量类型
Java变量类型 在Java语言中,所有的变量在使用前必须声明 声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...]; 格式说明: type:为Java数据类型 identifier:是变量名 可以使用逗号隔开来声明多个同类型变量 int a, b, c; // 声明三个int型整数:a、 b、c int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值 byte z = 22;
用户8639654
2021/07/19
9790
成员变量 局部变量 全局变量
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时时,在其他模块中寻找其定义。另外,extern也可用来进行链接指定
xy_ss
2023/11/22
3930
成员变量 局部变量 全局变量
一文搞清楚Java中的方法、常量、变量、参数、代码块
在上一篇文章:一文搞清楚Java中的包、类、接口中我们讲了Java中的包、类和接口,今天继续将剩下的方法、常量、变量以及参数梳理完。
JavaBuild
2024/05/27
4090
一文搞清楚Java中的方法、常量、变量、参数、代码块
【面试题精讲】Java成员变量与局部变量的区别?
成员变量和局部变量都是 Java 中常用的变量类型。成员变量存储在堆内存中,具有较长的生命周期和共享性;而局部变量存储在栈内存中,生命周期短暂且仅限于所属的方法、构造函数或代码块。通过合理使用这两种变量,我们可以更好地管理数据和控制程序流程。
程序员朱永胜
2023/10/05
7900
作用域
标识符的作用域有函数原型作用域、局部作用域(块作用域)、类作用域和 命名空间(namespace) 作用域
小飞侠xp
2022/05/13
1.1K0
Java匹马行天下之JavaSE核心技术——面向对象
Java中可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
泰斗贤若如
2019/11/09
5250
推荐阅读
相关推荐
JAVA变量的作用域
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档