文章目录
一、变量二、类变量(静态变量)三、实例变量(成员变量)四、局部变量五、实例变量与局部变量的区别六、全局变量小编一直分不清成员变量和全局变量,认为它们是一个东西,现在跟着小编来看一看,到底一样还是不一样呢?( *-)ρ(*╯^╰)
一、变量
什么是变量?在执行程序的过程中,值可以发生变化的量。
定义变量格式:数据类型 变量名=变量值
变量的分类(在Java中):1.类变量 2.实例变量3. 局部变量
类变量就是静态变量:在方法外类之内,用static(静态的)修饰的变量实例变量就是成员变量:在方法外类之内,但没有用static修饰的变量局部变量:方法体中的变量,方法的参数列表中的变量也是局部变量。它随着所在方法的产生而产生,使用而使用,销毁而销毁。
重点来了,,,java中没有全局变量,在C和C++中有全局变量
全局变量的概念是在C和C++中的。
在C中全局变量指在函数外部定义的变量,可为本文件所有函数共用的变量,作用域是从定义变量的位置开始,到整个文件结束及有extern声明的其它源文件
变量的访问规则:就近原则
public class we {public static void main(String[] args) {int num=50;getNum(num);}public static void getNum(int num1){int num=100;System.out.println(num);}}输出结果为100.
public class we {public static void main(String[] args) {int num=50;e e=new e();e.getNum(num);}}class e{int num=100;public void getNum(int num){System.out.println(num);}}输出结果为50.
public class we {public static void main(String[] args) {int num=50;e e=new e();e.getNum(num);}}class e{int num=100;public void getNum(int num){System.out.println(num);System.out.println(this.num);}}输出结果为50和100.
二、类变量(静态变量)
声明格式:访问修饰符[非访问修饰符] static 数据类型 变量名; 或者
访问修饰符[非访问修饰符] static 数据类型 变量名 = 变量值;
该变量用static修饰,即在成员变量前加static,则成员变量变静态变量
存在与方法之外类之内,存在于方法区
stctic关键字修饰的变量在所在的类中是共享的。
在jdk1.8之前静态变量存储在方法区(永久代)的静态区中(被加载后的位置),在jdk1.8之后方法区(永久代)被移除了,取而代之的是元空间,元空间中存储的主要是class文件的元数据,静态变量的存储位置就转移到了堆内存中。不论是静态方法还是实例方法都是在栈内存中进行的。
每个线程都会在栈内存中开辟一个栈,在调用方法时,对应的方法都会在执行这个方法的线程的栈中创建一个“栈帧”,栈帧中保存了局部变量表(基本数据类型和对象引用)、操作数栈、动态连接和返回地址等信息。等到方法执行完毕,栈帧被销毁,对应的内存也将被释放。
类变量(静态变量)初始化后(声明时赋值后),它的值是不变。
类变量在所在类被加载时优先于其他变量加载,且无论该类有多少个对象,类只拥有类变量的一份copy。
随着类的加载而加载,销毁而销毁
三、实例变量(成员变量)
小编根据实例变量中的实例理解的是:此变量在类实例化对象时可以作为对象的属性,作为对象、成员的属性所以叫做实例变量或者成员变量。小编习惯上把实例变量叫做成员变量。实例方法:相对于静态方法而言的,就是没有用static修饰的一般方法,只能用对象.方法名调用。
声明格式:访问修饰符[非访问修饰符] 数据类型 变量名; 或者
访问修饰符[非访问修饰符] 数据类型 变量名 = 变量值;
在初始化对象时,每一个对象都会有相同的属性,这些属性都是由实例变量变化而来的。当一个对象被实例化之后,每个实例变量的值就跟着确定存在与堆中实例变量存在于方法之外类之内(声明位置),不用static修饰的变量实例变量在对象实例化的时候创建,在对象销毁时销毁。实例变量在声明时可以不用赋值,有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定。
四、局部变量
声明格式:数据类型 变量名 = 变量值; 或者
数据类型 变量名; 但此方式在使用该变量前,要给该变量赋值。
声明在方法、语句块中。方法的参数列表中的变量也为局部变量。局部变量在栈中分配,存在于栈中局部变量在声明时,必须赋一个初始值,才可以使用。随着所在方法 语句块的调用而调用,销毁而销毁。访问修饰符、static不能修饰局部变量
访问修饰符
五、实例变量与局部变量的区别
实例变量在方法、语句块之外;局部变量在方法、语句块之内实例变量在声明时可以不用赋值,局部变量在声明时或者使用前要赋值实例变量在堆内存中,局部变量在栈中。实例变量可以用访问修饰符修饰,局部变量不能实例变量是跟随与类的,局部变量是跟随与方法、语句块的。public class we {String name;//name为实例变量,成员变量static int m=9; //m为类变量//构造器public we(String name) {//name为局部变量double h=1.23;//h为局部变量this.name = name;}public we(){double h=1.23;//h为局部变量}//代码块、语句块{double h=1.23;//h为局部变量}static{double h=1.23;//h为局部变量}public static void main(String[] args) {//主方法中的args为局部变量double h=1.23;//h为局部变量}public int getJie(int n){//n为局部变量return 0;}}
六、全局变量
(简单理解)
Java中没有全局变量这一概念。在C语言中的变量,从作用域来说分为全局变量和局部变量在函数外部定义的变量,可为本文件所有函数共用的变量称作全局变量,也称外部变量作用域是从定义变量的位置开始,到整个文件结束停止,及有extern声明的其它源文件。
其实全局变量在理解上和实例变量是一样的,但是在Java中没有全局变量这一概念,这是C语言中的概念。
如果觉得《成员变量 全局变量和局部变量》对你有帮助,请点赞、收藏,并留下你的观点哦!