引言

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 国籍:中国
姓名:李四 身份证号:444444444444 国籍:中国

可以看出来,这个Chinese类抽象的是中国人,所以这里面”国籍“实例变量就可以声明为静态变量,让国籍固定为chinese;
访问时只需要用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 国籍:中国

可以看到输出结果都是一样的,这时候应该会有一个疑问:既然输出结果都一样,那么用静态变量有什么用呢?
这就涉及到底层的内存了,简单说一下,实例变量都存放在堆中,每一个实例变量都会占有一定的内存空间,像”国籍“这个实例变量同样每声明一个对象就会多占用一块空间,而静态变量存放在方法区中,而且只需要声明一次,这个类就可以一直用;

所以,如果这个类的所有对象的属性值都是一样的,不建议定义为实例变量,会浪费内存空间
建议定义为静态变量,在方法区中只保留一份,节省内存的开销

小总结

对于静态变量,
对象级别的变量不需要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中的static———静态变量相关推荐

  1. 二十五、深入Java中的static静态修饰符

    @Author:Runsen @Date:2020/6/2 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  2. PHP中的static静态变量的使用方法详解

    php中的变量作用范围的另一个重要特性就是静态变量(static 变量).静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果. <?php ...

  3. Java中的static静态代码块

    一.与静态方法的比较 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要 ...

  4. Java中父类的静态变量和静态方法的继承问题

    1.普通父类的静态变量和方法,可以通过子类的名称访问和调用 2.普通父类的静态变量和方法,可以通过子类的实例对象访问和调用 3.抽象父类的静态变量和方法,可以通过具体子类的名称访问和调用 4.抽象父类 ...

  5. java aio为什么不稳定_为什么我不提倡在Java中使用static

    static从Java1.0开始便是Java中的关键字,用于表征静态属性或方法.它也得到了广泛的应用,在业务中定义XXXUtil是一种常规的模式,甚至是比较知名的类库(比如Apache Common ...

  6. php的 静态变量,PHP之static静态变量详解

    在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...

  7. java键盘输入字符串静态变量_Java 中为什么样在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?老师说字符串常量和静态变量放在data segment中...

    在上一篇文章中,小编为您详细介绍了关于<C字符串以'\0'结尾的问题?为什么样C语言字符串常量可以当做指针>相关知识.本篇中小编将再为您讲解标题Java 中为什么样在静态方法中可以调用的方 ...

  8. C#中static静态变量的用法

    原文:C#中static静态变量的用法 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析 ...

  9. 面试季,Java中的static关键字解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面 ...

最新文章

  1. AlertDialog(对话框)的基本使用
  2. 【Java】6.3 类成员
  3. python学习-装饰器(decorator)
  4. 前端学习(1732):前端系列javascript之插入内容
  5. synchronized使用和原理全解
  6. 每天一个linux命令(lsof)
  7. 算法岗面试前怎样高效刷题?
  8. 【LeetCode笔记】155. 最小栈(Java、栈)
  9. 强化学习离轨策略:从失败中获得成功经验 - 以追女孩为例 | 采样率的数学意义
  10. LeetCode 530二叉搜索树的最小绝对差
  11. Three.js 关于立方体贴图产生边缘锯齿问题
  12. Windows窗口程序设计入门(C#版)
  13. 进行网络数据采集时用 CSS——避免蜜罐
  14. 解析app流量商业化变现,ADCDN助力开发者变现双倍增长
  15. 古代的圣人看你还了解几个
  16. liunx下rdesktop无法使用,安装remmina
  17. qt5.8 msvc2015使用linguist乱码问题解决
  18. VS2010中MSCOMM 串口通信控件的注册使用
  19. 都有哪些好用的设备维护管理软件?这5款值得一试
  20. 数学建模-电池剩余放电时间预测

热门文章

  1. 读懂 | 路由器简史
  2. 数据中心的运维管理原则(一)
  3. win10一直卡在自动修复_Win10今年最重磅更新!低CPU占用率+16大新特性,系统快如闪电!...
  4. 京瓷2010复印a4内容不全_京瓷2010复印机,纸卡定影的故障
  5. DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
  6. Python编程语言学习:sklearn.manifold的TSNE函数的简介、使用方法、代码实现之详细攻略
  7. Interview:算法岗位面试—10.24下午—上海某软件公司(机器学习,上市)电话面试—考察SVM、逻辑回归、降低过拟合、卷积网络基础等
  8. Python语言学习之字母A开头函数使用集锦:assert用法之详细攻略
  9. ML之kNN(两种):基于两种kNN(平均回归、加权回归)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
  10. 【Linux】一步一步学Linux——Unix发展史(02)