-
2020-11-23 00:29:57
静态的成员变量与非静态的成员变量的区别:
- 作用上的区别:
1) 静态的成员变量的作用是共享一个数据给所有的对象使用。
2)非静态的成员变量的作用是描述一类事物的公共属性。 - 数量与存储位置上的区别:
1)静态成员变量是存储方法 区内存中,而且只会存在一份数据。
2)非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。 - 生命周期的区别:
1)静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
2)非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。
更多相关内容 - 作用上的区别:
-
关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍
2013-09-23 16:41:25详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序 -
java之成员变量(实例成员变量和静态成员变量)
2021-01-16 12:44:45在java中,成员变量分为两种:实例成员变量和静态成员变量。 1.1.1实例成员变量 实例成员变量:是定义在方法外部和类内部的且不被static所修饰的变量.用于描述一个类中包含哪些数据 代码示例: class Person ...类的成员
类的成员可以包含以下:字段、方法、代码块、内部类和接口等。此处我们重点介绍字段.
1.1字段/属性/成员变量
在类中, 但是方法外部定义的变量. 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严格区分).
在java中,成员变量分为两种:实例成员变量和静态成员变量。
1.1.1实例成员变量
实例成员变量:是定义在方法外部和类内部的且不被static所修饰的变量.用于描述一个类中包含哪些数据
代码示例:
class Person { public String name;//其别名有三种:属性/实例成员变量/字段 public int age; public boolean flg; public char ch; } public class LeiHeDuiXiang { public static void main(String[] args) { Person person = new Person(); //默认值为0 System.out.println(person.age); //默认值为null System.out.println(person.name); //默认值为'\u0000',输出时不显示任何东西 System.out.println(person.ch); //默认值为false System.out.println(person.flg); }
注意事项:
1:通过对象的引用来访问实例成员变量
2:"访问" 既包含读, 也包含写.
3:对于一个成员变量如果没有显式设置初始值, 那么会被设置一个默认的初值.
下面来介绍下成员变量(不管是静态成员变量还是实例成员变量)在不赋值情况下的默认取值吧:
byte short int long默认取值为 0
float 默认取值为0.0f;
double 默认取值为0.0
boolean 默认取值为false
char 默认取值为'\u0000'(最终输出时为空)
1.1.2静态成员变量
static关键字修饰成员变量,简称静态成员变量,又称类变量
1.访问方式:通过类名.静态成员变量名进行访问
2.内存的存储方式:方法区
3.特点:静态的只有一份,且不依赖对象代码示例:
class Man { public static int count; } public class LeiHeDuiXiang { public static void main(String[] args) { Man.count++; System.out.println(Man.count); Man.count++; System.out.println(Man.count); Man.count++; System.out.println(Man.count); } } //输出结果为: 1 2 3
因为count为静态成员变量,其存储在方法区中且只有一个,是共享的,所以每次当访问它时,都会影响它的值
1.2认识null
null 在 Java 中为 "空引用", 表示不引用任何对象. 类似于 C 语言中的空指针. 如果对 null 进行 . 操作就会引发异常.
代码示例:
class Person { public String name; public int age; } class Test { public static void main(String[] args) { Person person = new Person(); System.out.println(person.name.length()); // 获取字符串长度 } } // 执行结果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:9)
同时假如我们给一个对象的引用赋值为null时,当输出这个引用此时还是为null,而假如此时不为空的话,输出值又会为多少呢?
Person person1 = new Person(); System.out.println(person1);
上述代码最终的输出结果为如下:
Person为类,@为分隔符,4554617c为对象地址的哈希值,那么为什么最终的输出结果为这个呢?我们来看下源码便一清二楚了
1首先来看println处的源码:
Object类为所有类的父类,valeOf方法是将引用x转化为字符串,那么是如何转化的呢?我们接着看valeOf的源码:
此处判断这个引用是否为空,若为空,则返回null,若不为空,则返回这个引用所调用的toString方法的返回值,那么我们再来看toString方法的源码吧:
我们可以看到,toString方法返回的是类的名字加上一个分隔符号@再加上一个把哈希值变成十六进制的数字
总结:1.当我们输出对象的引用时,此时我们会在底层调用Object类的toString方法,返回一个对象地址的十六进制哈希值
2.toString 方法会在 println 的时候被自动调用. 将对象转成字符串这样的操作我们称为 序列化.
3. toString 是 Object 类提供的方法, 我们自己创建的 Person 类默认继承自 Object 类, 可以重写 toString 方法实现我们自己版本的转换字符串方法. (关于继承和重写这样的概念, 我们后面会重点介绍).
4.IDEA快速生成Object的toString方法快捷键:alt+f12(insert),此处我们没有重写这个默认的toString方法,并无大碍,后面会详细介绍。
1.3成员变量初始化
很多时候我们不希望成员变量使用默认值, 而是需要我们显式设定初值. 那么此时有五种方法供我们成员变量初始化:
1:默认初始化,即程序所赋予的默认值,上面已经讲过,此处不再过多陈述。
2:就地初始化:即在定义成员变量时便进行初始化,如下所示:
public String name = "张三"; public int age = 18;
3:类外初始化,即通过对象的引用进行初始化,这种方法一般用的最多,下面来看下实现过程:(注意私有的可通过setXX和getXX方法实现)
public static void main(String[] args) { Person person = new Person(); person.name = "张三"; person.age = 14; }
4:通过实例代码块和静态代码块进行初始化:这个在后面我们会专门讲到,在这里只需要知道这两个代码块的作用一般是提前初始化一些数据.
5.通过构造方法进行初始化。
-
java中什么叫静态成员变量
2021-02-26 08:24:08静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。
1. 静态局部变量
在局部变量的说明前再加上static说明符就构成静态局部变量。
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜
—————————————————————————————————————————————————————————
给读者一个简单直白的例子(区别静态局部变量和动态局部变量):
——————————************************************************************——————————
int fun(int n)
{
static int f=1; /*请注意这行的修改*/ 这是 static 结果:
f=f*n;
return(f);
}
main()
{
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fun(i));
}
——————————************************************************************——————————
int fun(int n)
{
int f=1; /*请注意这行的修改*/ 结果是:
这是auto 的结果
f=f*n;
return(f);
}
main()
{
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fun(i));
}
————————————————————————————————————————————————————————————————
2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
静态变量
除范围之外,变量还有存活期,在这一期间变量能够保持它们的值。在应用程序的存活期内一直保持模块级变量和公用变量的值。但是,对于 Dim 声明的局部变量以及声明局部变量的过程,仅当过程在执行时这些局部变量才存在。通常,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。
但可将局部变量定义成静态的,从而保留变量的值。在过程内部用 Static 关键字声明一个或多个变量,其用法和 Dim 语句完全一样:
Static Depth
例如,下面的函数将存储在静态变量 Accumulate 中的以前的运营总值与一个新值相加,以计算运营总值。
Function RunningTotal (num)
Static ApplesSold
ApplesSold = ApplesSold + num
RunningTotal = ApplesSold
End Function
如果用 Dim 而不用 Static 声明 ApplesSold,则以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。
在模块的声明段声明 ApplesSold,并使它成为模块级变量,由此也会收到同样效果。但是,这种方法一旦改变变量的范围,过程就不再对变量排他性存取。由于其它过程也可以访问和改变变量的值,所以运营总值也许不可靠,代码将更难于维护。
声明所有的局部变量为静态变量
为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。例如:
Static Function RunningTotal (num)
这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或 Private 声明的还是隐式声明的。可以将 Static 放在任何 Sub 或 Funtion 过程头的前面,包括事件过程和声明为 Private 的过程。
◆◆
评论读取中....
请登录后再发表评论!
◆◆
修改失败,请稍后尝试
-
java中静态变量和成员变量的区别
2021-04-26 20:58:06java中静态变量和成员变量的区别 1、静态变量。 由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象...java中静态变量和成员变量的区别
1、静态变量。
由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象的特殊描述。
2、成员变量
研究一个事物(类),其有: 属性:外在特征;例如人的身高,体重,(对应class成员变量)
行为:能够做什么;例如人有说话,打球等行为。(成员函数)3、成员变量和静态变量的区别
1、两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。2、调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。3、别名不同
成员变量也称为实例变量。
静态变量也称为类变量。4、数据存储位置不同
成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。 -
java中静态成员变量和非静态成员变量的区别
2019-03-08 15:50:08静态成员变量值是所有类的实例共享的,所以调用的时候只需要 类名.属性名 就可调用(也只能这样调用),而非静态成员变量的值是各个实例私有的,所以调用的时候必须是先有具体的类的实例,然后通过实例名来调用。也... -
Java非静态成员变量之死循环(详解)
2020-08-29 07:57:55下面小编就为大家带来一篇Java非静态成员变量之死循环(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
java静态成员变量不需要赋初值
2018-08-01 16:04:12在Employer类中定义了静态成员变量nextID与成员变量ID class Employer{ private static int nextID; private String name; private double salary; private ... -
Java中成员变量、局部变量、全局变量、静态变量存在位置及初始化
2021-03-08 09:17:50成员变量是 定义在一个类的变量:类中方法外局部变量是定义在一个方法内的变量:方法中成员变量分为:静态属性:随类的存在而存在,是在类加载的初始化非静态属性:随实例的属性存在而存在。局部变量:局部变量不能... -
Java中静态成员变量与非静态成员变量的区别
2019-04-19 20:19:12如果我们在成员变量前边加上static关键字,这个变量就成为静态成员变量,我们又把这种变量叫做“类变量”,因为这样的变量在这个类的所有对象里只有一个,这个类的所有对象“共享”同一个类变量。 -
Java 静态变量的初始化
2021-08-21 14:04:10静态变量的初始化 转载 https://blog.csdn.net/wanghao109/article/details/49591815 class Singleton{ public static Singleton singleton = new Singleton(); public static int a; public static int b = 0;... -
Java静态变量和成员变量初始化顺序
2018-08-01 19:22:49首先放一段代码,帮助我们分析变量初始化过程,大家可以先想一下他的输出,然后在看下面的运行结果: public class InitTest{ public static int k = 0; public static InitTest t1 = new InitTest("t1"... -
Java中static变量作用和用法详解
2021-02-12 22:45:17static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖... -
Frida 主动设置静态成员变量和非静态成员变量的值
2021-12-31 18:36:15import android.content.Intent; import android.util.Log; public class FridaActivity3 extends BaseFridaActivity { private static boolean static_bool_var = false;... private boolean bool_var = false;... -
对于Java静态成员变量和非静态成员变量的一些学习方法
2015-03-14 12:25:30内存的划分 首先,一个程序在执行的时候,不同的代码会在内存开辟... 数据区(data segment):存放静态成员变量和字符串常量 栈(stack):局部变量 堆(heap):通过new创建出来的对象. heap stack data segment -
Java中静态变量/成员变量、静态内部类/成员内部类小节
2021-04-14 17:19:18静态内部类和内部类的关系 只有内部类才能被声明为静态类,即静态内部类; 只能在内部类中定义静态类; 静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在;...是否能拥有静态成员:静态内部类. -
java类中静态变量是如何被赋值的
2019-09-08 10:50:57我们知道java中类加载的过程分为:加载、连接、初始化,其中连接阶段又分为验证、准备和解析,准备阶段的动作就是为类的静态变量分配内存,并将其设置为一个默认值,java中各种数据类型的默认值如下: 数据类型 ... -
Java学习笔记八---类的静态变量与静态方法的访问与调用方式
2021-03-15 10:46:39静态变量又称类变量,静态方法又称类方法,它们统称为静态成员或类成员。静态成员由static修饰,是属于整个类的,所有的对象共享这些静态成员。不需要创建任何对象,静态成员在类装载时就已初始化了,整个运行期间其... -
Java如何读取配置文件并赋值静态变量
2021-03-03 13:43:04应用场景项目开发中某个功能需要抽取成方法写成一个工具类,...由于我写的这个工具类中需要读取配置文件中的内容,可是常规方式注入成员变量时都不是静态的,不能直接调用,比如这种方式:@Data@Componentpublic c... -
静态成员变量只能初始化一次
2019-07-26 17:58:00public class staticTest{ private static long r = gett1(); private static long a = 0;...public static void main(String[] args) ...三次打印都为1,因为static成员变量(字段)只在第一次使用时会初始化。 -
Java-静态成员变量值到底能不能变?
2018-01-23 19:10:53Java-静态成员变量值到底能不能变?? -
关于Java:何时初始化静态变量?
2021-03-16 14:11:38我想知道何时将静态变量初始化为其默认值。加载类时是否创建(分配)了静态var是否正确,然后执行静态初始化程序和声明中的初始化?在什么时候给出默认值? 这导致前向参考的问题。另外,如果您可以参考"为什么不及时... -
Java静态变量的初始化
2019-06-28 01:12:53静态变量的初始化方式 在静态变量的声明时初始化 在静态代码块中初始化 静态变量的初始化时机 在类的生命周期内,静态变量只会被初始化一次。 静态变量的初始化时机需要分情况讨论 静态变量类型 初始化时机 ... -
java 图说 全局变量 成员变量 静态变量 实例变量 局部变量 的关系和区别
2019-03-30 18:57:02版权声明:Hi,屏幕前的猿你好,此篇博文中的内容如帮到你,请一定不能吝啬帮我点赞,评论,关注,帮我来个全套大保健呢!我愿与你一同成长变强,得到技术加持,祈愿!...刚入门java时,对这些个各种名称... -
java 利用反射获取内部类静态成员变量的值操作.docx
2022-01-13 11:01:15java 利用反射获取内部类静态成员变量的值操作.docx -
java static变量可以赋值吗?
2021-03-09 22:31:12static的主要作用是静态成员,指该变量的实例在内存中之存放一次。赋值是可以随便改的。java中static关键字static是java中非常重要的一个关键字,主要有两种作用:● 第一:为某特定数据类型或对象分配单一的存储... -
Java中非静态成员变量、静态成员变量的初始化时机。
2018-05-22 11:48:11Java中非静态成员变量、静态成员变量的初始化时机。 非静态变量 我们在这里分析三种结构,着重分析这三种结构的初始化顺序: 成员变量初始化语句; 成员变量初始化块; 构造函数; 示例一: public class ... -
Java中static变量作用和用法步骤
2020-12-22 16:00:04static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也是说,它不... -
java变量之全局变量(静态变量,成员变量),局部变量,的关系和区别
2021-09-24 12:40:34可能刚学java对这些变量很懵,直接上图,接下来进行代码解释 ...2:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。 3:简单来说就是被static修饰后的值可以直接类...