Java中的static--静态变量你了解吗
目录
- 引言
- 引言
- 什么时候使用静态变量?
- 小总结
- 引用访问静态变量
- 小总结
- 总结
引言 static 是 java 语言中的关键字,意思是“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。
初学stat
引言 static 是 java 语言中的关键字,意思是“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。
初学static的最大的问题就是:static有什么用?什么时候用?这里先说一下static的作用:
static的作用就是用于区分成员变量、方法、内部类、初始化块这四种成员到底属于类本身还是属于实例这篇文章先介绍静态变量,后面几种会再下面的篇章中分别介绍
静态变量是成员变量的一种,静态变量存储在方法区中,则它在类加载时就会进行初始化,所以静态变量访问的时候不需要创建实例(对象),直接可以通过类名来访问;
什么时候使用静态变量?
先来看一个代码:
public class StaticTest01 {public static void main(String[] args) {Chinese c1 = new Chinese("张三", "333333333333", "中国"); System.out.print("姓名:" + c1.name); System.out.print(" 身份证号:" + c1.idNum); System.out.println(" 国籍:" + c1.nation); Chinese c2 = new Chinese("李四", "444444444444", "中国"); System.out.print("姓名:" + c2.name); System.out.print(" 身份证号:" + c2.idNum); System.out.println(" 国籍:" + c2.nation); }}class Chinese {// 姓名; 实例变量String name; //身份证号; 实例变量String idNum; //国籍; 实例变量String nation; //无参构造器public Chinese() {}//有参构造器public Chinese(String myName, String myIdNum, String myNation) {this.name = myName; this.idNum = myIdNum; this.nation = myNation; }}
输出结果:
姓名:张三 身份证号:333333333333 国籍:中国可以看出来,这个Chinese类抽象的是中国人,所以这里面”国籍“实例变量就可以声明为静态变量,让国籍固定为chinese;
姓名:李四 身份证号:444444444444 国籍:中国
访问时只需要用Chinese类来访问就可以了;
代码如下:
public class StaticTest02 {public static void main(String[] args) {Chinese c1 = new Chinese("张三", "333333333333"); System.out.print("姓名:" + c1.name); System.out.print(" 身份证号:" + c1.idNum); // 静态变量不需要实例化,只需要用类来访问就可以了System.out.println(" 国籍:" + Chinese.nation); Chinese c2 = new Chinese("李四", "444444444444"); System.out.print("姓名:" + c2.name); System.out.print(" 身份证号:" + c2.idNum); System.out.println(" 国籍:" + Chinese.nation); }}class Chinese {// 姓名; 实例变量String name; //身份证号; 实例变量String idNum; //国籍; 静态变量static String nation = "中国"; //无参构造器public Chinese() {}//有参构造器public Chinese(String myName, String myIdNum) {this.name = myName; this.idNum = myIdNum; }}
输出结果:
姓名:张三 身份证号:333333333333 国籍:中国可以看到输出结果都是一样的,这时候应该会有一个疑问:既然输出结果都一样,那么用静态变量有什么用呢?
姓名:李四 身份证号:444444444444 国籍:中国
这就涉及到底层的内存了,简单说一下,实例变量都存放在堆中,每一个实例变量都会占有一定的内存空间,像”国籍“这个实例变量同样每声明一个对象就会多占用一块空间,而静态变量存放在方法区中,而且只需要声明一次,这个类就可以一直用;
所以,如果这个类的所有对象的属性值都是一样的,不建议定义为实例变量,会浪费内存空间;
建议定义为静态变量,在方法区中只保留一份,节省内存的开销;
【Java中的static--静态变量你了解吗】
小总结
对于静态变量,
对象级别的变量不需要static
类级别的变量需要static
对象级别:一个对象对应一份数据,各个对象都可以不同
类级别: 所有对象对应一份数据,各个对象都一样
引用访问静态变量
静态变量可以使用引用去访问,但实际上在执行过程中,引用所指向的对象并没有参与,如果是空引用访问实例变量,程序一定会发生空指针异常,但是如果用空引用访问静态变量,程序并没有发生空指针异常,所以通过引用访问静态变量实际上还是直接通过类去访问的
测试代码:
public class StaticTest03 {public static void main(String[] args) {Chinese c = new Chinese("张三", "3333333333"); System.out.print("姓名:" + c.name); System.out.print(" 身份证号:" + c.idNum); //这里使用引用调用了静态变量nationSystem.out.println(" 国籍:" + c.nation); //将引用c置空c = null; /*这两个实例变量当引用c置空后就它所指向的实例就无法从堆内存中找到了System.out.print("姓名:" + c.name); System.out.print(" 身份证号:" + c.idNum); *///而因为nation是静态变量,存放在方法区中,还是可以找到;System.out.println(" 国籍:" + c.nation); }}class Chinese {// 姓名; 实例变量String name; //身份证号; 实例变量String idNum; //国籍; 静态变量static String nation = "中国"; // 无参构造器public Chinese() {}// 有参构造器public Chinese(String myName, String myIdNum) {this.name = myName; this.idNum = myIdNum; }}
小总结
通过代码测试,可以知道通过引用也可以访问静态变量,但是知道就行,不要这样做,因为采用引用方式访问的时候,程序员会认为你访问的是实例变量,就会给程序员产生困惑;
总结 对于静态变量,我们需要掌握它的用法、特点,要记住,只要与实例有关系的,必须先创建对象,然后通过引用的方式去访问,如果空引用访问实例相关的成员,必然会出现空指针异常;所有静态相关的,直接使用类名去访问,虽然静态相关的成员也能使用引用去访问,但是不要去使用,养成良好的代码习惯很重要!
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 事件代理
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- Java|Java OpenCV图像处理之SIFT角点检测详解