Java中局部变量和成员变量的区别详解
作者:一一哥Sun 发布时间:2021-12-26 11:53:36
一. 关于变量
在之前的文章中,已经给大家详细地介绍过变量相关的内容,比如变量的概念、命名规范、变量的定义及底层原理等内容。但其实变量还有作用范围的概念,并且根据作用范围的不同,变量还可以分为成员变量、局部变量等内容。在我们今天开始学习局部变量和成员变量等内容之前,先简单地带大家复习一下之前的变量内容。
1. 概念
我们知道,在Java中,变量是程序里最基本的存储单元,它由变量名、变量类型、作用域组成。从本质上来说,变量其实就是内存里的一小块存储区域,该区域只能存储声明变量时指定类型的数据。我们创建使用每个变量前,必须先声明,在内存中申请空间,然后对其进行初始化赋值,接着就可以通过变量名来访问和使用这块内存区域了。
进一步解释一下,变量其实就是一个可以存储特定类型数据的容器。这个容器在内存中有自己的地址,为了方便地找到这个地址,我们可以给每个地址起个”名字“,这就是”变量名“。每个变量的数据类型都是固定不变的,但变量中对应数据的具体内容,却是可以改变的,所以”变量“指的就是内容可以改变的量。
2. 命名规范
而且变量的命名需要遵循一定的规范,基本的规则和规范如下:
①. Java标识符由 字母(含英、中、日、俄等)、数字、下划线"_" 和 美元符号$(音: dollar)组成, 如age、G7、_value、$salary;
②. 不能以数字开头, 如123abc;
③. 严格区分大小写, 如class与Class是不同的;
④. 长度无限制(一般不要超过15个字符);
⑤. 不能是Java中的保留字和关键字。
Java的变量名也是一种标识符,所以必须遵循以上这些规则! 另外还有一些命名规范需要我们尽量遵守,比如:
变量名尽量要做到见名知意。在实际开发时尽量不要写a、b、c这种名称;
变量名的首字母要小写。如果名称由多个单词组成,第一个单词的首字母应小写,剩下的单词首字母应大写(驼峰式命名法),例如
xxxYyyZzz、numCounter
。
3. 作用范围
其实,除了以上的这些规范之外,我们在定义变量时还要考虑它的作用范围,或者说是作用域。
变量的作用范围,或者叫作用域,是指一个变量的有效范围。有的变量在整个类中都是有效的,也有的变量只在方法内部有效,超过这个范围就无效了。 如果我们在超出了作用域的地方引用这些变量,编译器就会报错。这就好比,不同的人有不同的权力,有的人权力比较大,可以在全世界发号施令;有的人权力比较小,只能在自己家里发号施令,这就是自己的”作用范围“或者”作用域“。
我们在定义变量时,要遵循作用域最小化的原则,尽量将变量定义在尽可能小的作用范围内,并且不要重复使用变量名。
4. 变量分类
在Java中,我们可以根据变量的作用范围,将Java的变量分为两大类:
局部变量: 局部变量只在定义它的方法或代码块内部有效,不能在其他的方法或代码块中使用。也就是说,局部变量只在一个方法或代码块的一对{}之间有效。局部变量定义的范围包括形参、方法内部、代码块内部。
成员变量:成员变量在整个类内部都有效,可以在当前类的任何方法中使用。根据是否带有static关键字,成员变量又分为静态变量(类变量)、实例变量(对象变量)。
二. 局部变量
1. 概念
在上面的章节中,其实已经跟大家介绍了局部变量的概念,即:
局部变量是在定义形参、方法或代码块内部的变量,该变量只在当前方法、代码块中有效。
2. 特点
局部变量具有如下特点:
局部变量声明在方法、构造方法或者代码块、形参中;
局部变量在方法、构造方法、或者语句块被执行时创建,当它们执行完成后,局部变量就会被销毁;
访问修饰符不能添加在局部变量上;
局部变量只在声明它的方法、构造方法或者代码块、形参中可见;
局部变量是在栈上分配的;
局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。
3. 案例
在下面的案例中,给大家定义了几个局部变量供大家参考。
/**
* @author
*/
public class Demo01 {
//args也是一种局部变量,在main(){}方法的{}范围内有效
public static void main(String[] args) {
//局部变量,在main(){}方法的{}范围内有效
int a = 10;
System.out.println("a=" + a);
}
public void showAge() {
//i也是一种局部变量,只在for(){}这对{}范围内
for(int i=0;i<100;i++) {
System.out.println("age=" + age);
}
}
}
三. 成员变量
1 概念
所谓的成员变量,是指在类中(不是方法或其他代码块)直接定义的变量。根据是否带有static关键字,成员变量又分为静态变量(类变量)、实例变量(对象变量) 。成员变量在整个类的内部都有效,可以在当前类的任何方法中使用。另外如果成员变量不是被private修饰的,还可以在其他的类中引用。
2. 实例变量
实例变量也被成为对象变量,是指在类中定义的非static变量。实例变量具有如下特点:
实例变量声明在一个类中,但在方法、构造方法和语句块的外面;
当一个对象被实例化之后,每个实例变量的值也就跟着确定了;
实例变量在对象创建时创建,在对象被销毁时销毁;
实例变量对于类中的方法、构造方法或者语句块都是可见的。一般情况下我们应该把实例变量设为私有,通过访问修饰符可以使实例变量对子类也可见;
实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,应该使用完全限定名:ObjectReference.VariableName。
3. 静态变量
静态变量又被称为类变量,是被static修饰的、直接定义在类中(方法之外)的变量,它具有如下特点:
静态变量可以被public、private、final和static修饰;
静态变量在方法外面定义,但可以在静态语句块中初始化,且初始化后不可被改变;
静态变量与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量都声明为public类型;
静态变量的默认值和实例变量相似;
静态变量通过
ClassName.VariableName
的形式进行访问;静态变量存储在静态存储区;
静态变量在第一次被访问时创建,在程序结束时销毁;
无论在一个类中创建了多少个对象,一个类都只拥有类变量的一份拷贝;
静态变量被声明为
public static final
类型时,变量名称一般建议使用大写字母。
4. 权限修饰符
大家要注意,成员变量的作用域,是可以通过权限修饰符来进行修改的。也就是说,我们可以给一个成员变量不同的修饰符,赋予该变量不同的权限。比如,我们可以给一个人身上赋予不同的”角色标签“,就可以改变这个人的”权力大小“。在Java中,有如下4种权限修饰符:
修饰符 | 类内部 | 同一个包 | 不同包的其他子类 | 同一个工程 |
---|---|---|---|---|
private | 可以(继承是特例) | |||
默认 | 可以 | 可以 | ||
protected | 可以 | 可以 | 可以 | |
public | 可以 | 可以 | 可以 | 可以 |
private私有的修饰符:可以修饰成员变量、成员方法、构造方法,但不能修饰类(内部类除外) 。被private修饰的成员只能在被修饰的本类中访问,在其他类中不能调用。 一般被private修饰的成员变量,是通过公开的set和get方法向外界提供访问方式。
defalut默认的修饰符:不用写任何关键字,它可以修饰类、成员变量、成员方法、构造方法。变量被默认权限修饰后,只能被本类以及同一个包下的其他类访问。
protected受保护的修饰符:可以修饰成员变量、成员方法、构造方法,但不能修饰类( 内部类除外 ) 。成员变量被protected修饰后,可以在同一类内部,和同一包中的其他类访问。如果不同包中的类想要访问被protected修饰的成员,这个类必须是其子类。
public公开的修饰符:是权限最大的修饰符,可以修饰类、成员变量、成员方法、 构造方法。成员变量被public修饰后,可以在任何一个类中任意使用,不管是否是同一个包。
5. 案例
在下面的案例中,定义了2个成员变量供大家参考:
/**
* @author
*/
public class Demo01 {
//实例变量、对象变量,在当前的Demo01类内部有效
private int age = 18;
//静态变量、类变量,因为是public公开的,在当前Demo01类内部,及其他类中都可以使用
public static String msg = "Hello,一一哥";
public static void main(String[] args) {
//注意:在static静态方法中不能引用非静态变量
//System.out.println("age=" + age);
System.out.println("msg=" + msg);
}
}
四. 结语
至此,就把局部变量相关的内容给大家介绍完了,现在你知道什么是局部变量及其特点了吗?另外我们要搞清楚局部变量和成员变量的区别:
1. 相同点:
定义变量的格式相同;
先声明后使用;
变量都有对应的作用域。
2. 不同点:
两者声明的位置及作用范围不同,如下表所示:
成员变量 | 直接定义在类中,根据修饰符的不同,可以在当前类或其他类中有效。 |
---|---|
局部变量 | 定义在方法的形参、方法内部、代码块内部的变量。只在当前方法及代码块内部有效。 |
来源:https://juejin.cn/post/7196808785976049720


猜你喜欢
- 生成文字图片:/// <summary> /// 生成文字图片 /// &l
- 1.概述我们之前讨论过Java Generics的基础知识。在本文中,我们将了解Java中的通用构造函数。 泛型构造函数是至少需要有一个泛型
- 本文实例为大家分享了java实现点击按钮事件弹出子窗口的具体代码,供大家参考,具体内容如下要求:1、在父窗口中添加一个按钮2、点击按钮弹出子
- 先上效果图源码 github.com/woshiwzy/Ca…实现原理:1.继承LinearLayout2.重写onL
- 1. SpEL 回顾经过上篇文章的学习,小伙伴们已经知道了,在 Spring Security 中,@PreAuthorize、@PostA
- SpringMVC通过模型视图ModelAndView渲染视图大致流程代码样例1.准备工作A.因为文中用到jsp,所以需要引入jsp标准标签
- 本文介绍idea的安装和基本使用首先保证JDK正常安装及配置下载地址:https://www.jetbrains.com/idea/down
- 前言相信大家在Android日常开发中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了。以前为了偷懒就直接去github
- 使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象(针对于对象的属性值相同,但对象地
- Android开发之设置开机自动启动的几种方法方法一:<!-- 开机启动 --> <receiver android:na
- kafka消费不到数据的排查集群上新安装并启动了3个kafka Broker,代码打包上传至集群,运行后发现一直消费不到数据,本地
- 问题:在项目中,当保存数据超过数据库字段列长度限制时,如何解决?一种常见的解决办法是:截串存取。顾名思义,就是对大文本数据按指定长度进行截取
- 赛马下周一就要去做java实验了,还记得上一次实验还有一个程序没写完,匆匆交了实验报告的半成品(希望老师没发现www)。为了下周一能有更充裕
- 今天一上班 被github上的一篇名为《教你用python玩跳一跳》吸引,它的星也瞬间从3400涨到4400 原作者主要就是用py
- 前言ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。我们知道,ConcurrentHas
- 一、opsForValue用法key:字符串,value:可以是任意对象Object(例如String、具体对象如自定义类Student等)
- Android 两个Fragment之间如何传递数据FragmentA启动FragmentB,做一些选择操作后,返回Fragme
- 一、概述解决ANR一直是Android 开发者需要掌握的重要技巧,一般从三个方面着手。开发阶段:通过工具检查各个方法的耗时,卡顿情况,发现一
- disruptor不过多介绍了,描述下当前的业务场景,两个应用A,B,应用 A 向应用 B 传递数据 . 数据传送比较快,如果用http直接
- 1: * 的定义: * 实际上是一个类,这个类实现了特定的接口,然后将这个类在 web.xml 文件中进行描述,这样服务器在启动的时候就可