今天主要学习下Java语言中的static关键字。

static关键字的含义及使用场景

static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)class A {

static {

System.out.println("A : 静态代码块");

}

static int i ; // 静态变量

static void method() {

System.out.println("A: 静态方法");

}

}

简而言之,被static关键字修饰的内容都是静态的。

静态是相对于动态的,动态是指Java程序在JVM上运行时,JVM会根据程序的需要动态创建对象并存储对象(分配内存),对象使命结束后,对象会被垃圾回收器销毁,即内存回收由JVM统一管理并分配给其他新创建的对象;静态是指Java程序还没有运行时,JVM就会为加载的类分配空间存储被static关键字修饰的内容;如静态成员变量,Java类加载到JVM中,JVM会把类以及类的静态成员变量存储在方法区,我们知道方法区是线程共享且很少发生GC的区域,所以被static关键字修饰的内容都是全局共享的,且只会为其分配一次存储空间。

所以当类的某些内容不属于对象,而由对象共享即属于类的时候,就可以考虑是否用static关键字进行修饰。

static关键字的的作用

1 修饰代码块

类中用static关键字修饰的代码块称为静态代码,反之没有用static关键字修饰的代码块称为实例代码块。

实例代码块会随着对象的创建而执行,即每个对象都会有自己的实例代码块,表现出来就是实例代码块的运行结果会影响当前对象的内容,并随着对象的销毁而消失(内存回收);而静态代码块是当Java类加载到JVM内存中而执行的代码块,由于类的加载在JVM运行期间只会发生一次,所以静态代码块也只会执行一次。

因为静态代码块的主要作用是用来进行一些复杂的初始化工作,所以静态代码块跟随类存储在方法区的表现形式是静态代码块执行的结果存储在方法区,即初始化量存储在方法区并被线程共享。

2 修饰成员变量

类中用static关键字修饰的成员变量称为静态成员变量,因为static不能修饰局部变量(为什么?),因此静态成员变量也能称为静态变量。静态变量跟代码块类似,在类加载到JVM内存中,JVM会把静态变量放入方法区并分配内存,也由线程共享。访问形式是:类名.静态成员名。public class StaticTest {

public static void main(String[] args) {

System.out.println(D.i);

System.out.println(new D().i);

}

}

class D {

static {

i = 2;

System.out.println("D : 静态代码块1");

}

static int i;

}

静态变量存储在类的信息中,且可以在线程间共享,那么它当然也属于该类的每个对象,因此可以通过对象访问静态变量,但编译器并不支持这么做,且会给出警告。

注意:

一个类的静态变量和该类的静态代码块的加载顺序。类会优先加载静态变量,然后加载静态代码块,但有多个静态变量和多个代码块时,会按照编写的顺序进行加载。class D {

static {

i = 2;

System.out.println("D : 静态代码块1");

}

static {

i = 6;

System.out.println("D : 静态代码块2");

}

static int i;

}

可以想一下运行的结果。

静态变量可以不用显式的初始化,JVM会默认给其相应的默认值。如基本数据类型的byte为0,short为0,char为\u0000,int为0,long为0L,float为0.0f,double为0.0d,boolean为false,引用类型统一为null。

静态变量既然是JVM内存中共享的且可以改变,那么对它的访问会引起线程安全问题(线程A改写的同时,线程B获取它的值,那么获取的是修改前的值还是修改后的值呢?),所以使用静态变量的同时要考虑多线程情况。如果能确保静态变量不可变,那么可以用final关键字一起使用避免线程安全问题;否则需要采用同步的方式避免线程安全问题,如与volatile关键字一起使用等。

static关键不能修饰局部变量,包括实例方法和静态方法,不然就会与static关键字的初衷-共享相违背。

3 修饰方法

用static关键字修饰的方法称为静态方法,否则称为实例方法。通过类名.方法名调用,但需要注意静态方法可以直接调用类的静态变量和其他静态方法,不能直接调用成员变量和实例方法(除非通过对象调用)。class D {

static {

i = 2;

System.out.println("D : 静态代码块");

}

static final int i;

int j;

static void method() {

System.out.println(i);

System.out.println(new D().j);

method1();

new D().method2();

}

static void method1() {

System.out.println(i);

}

void method2() {

System.out.println(i);

}

}

注意:既然类的实例方法需要对象调用才能访问,而静态方法直接通过类名就能访问,那么在不考虑部署服务器的情况下,一个类是如何开始执行的呢?最大的可能就是通过“类名.静态方法”启动Java,而我定义那么多静态方法,JVM又是如何知道主入口呢?

或许,你想到了main方法。

没错,就是main方法被Java规范定义成Java类的主入口。Java类的运行都由main方法开启:public static void main(String[] args) {

for (String arg : args) { // 参数由外部定义

System.out.println(arg);

}}

但注意main并不是Java关键字,它只是一个规定的程序入口的方法名字;另外main方法可以重载。

注意:static关键字虽然不能修饰普通类,但可以用static关键字修饰内部类使其变成静态内部类。static关键字本身的含义就是共享,而Java类加载到JVM内存的方法区,也是线程共享的,所以没必要用static关键字修饰普通类。

4 静态导入

在用import导入包或者类时,可以用static修饰包名或者类,表示静态导入。静态导入可以与动态导入放在一起比较来加深理解。

动态导入是当你程序运行时需要new一个不在此包中的类的对象时,才会根据全路径类名加载类;而静态导入则是随着类的加载而加载静态导入的类,所以它是提前导入的。public class StaticTest {

static void method1() {

System.out.println("static method1");

}

static void method2() {

System.out.println("static method2");

}

}

静态导入:import static com.starry.staticImport.StaticTest.method1;

public class Client {

public static void main(String[] args) {

method1(); //

StaticTest.method2();

}

}

注意method1()是静态导入,所以可以不需要通过类名访问;而method2()没有导入,则需要通过类名调用。那么什么时候需要静态导入呢?

静态导入常用于静态方法以及含有静态方法的类,枚举类等的导入,可以在编译阶段确定导入类的信息或者方法信息。

static关键字的缺点

封装是Java类的三大特性之一,也是面向对象的主要特性。因为不需要通过对象,而直接通过类就能访问类的属性和方法,这有点破坏类的封装性;所以除了Utils类,代码中应该尽量少用static关键字修饰变量和方法

java static关键字的作用是什么_static关键字有什么作用相关推荐

  1. Java static方法里为什么不能使用this关键字

    Static方法是类方法,先于任何的实例(对象)存在.即Static方法在类加载时就已经存在了(JAVA虚拟机初始化时), 但是对象是在创建时才在内存中生成.而this指代的是当前的对象. 参考:ht ...

  2. java基础9 main函数、this、static、super、final、instanceof 关键字

    一.main函数详解 1.public:公共的.权限是最大的,在任何情况都可以访问   原因:为了保证jvm在任何情况下都可以访问到main法 2.static:静态,静态可以让jvm调用更方便,不需 ...

  3. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  4. java static method_java static关键字静态方法详解,静态方法实例分享

    之前给大家介绍了一下java static关键字静态变量,那么下面要接着给大家介绍的就是静态方法,主要有成员方法涵盖内容以及静态方法与实例方法的区别以及实例介绍. 和成员变量相似,成员方法也能够分成下 ...

  5. java static 块作用_java static块有什么具体的作用和注意事项?说具体点

    展开全部 在Java语言中,static表示"全局"或者"静态"的62616964757a686964616fe4b893e5b19e3133333035346 ...

  6. Java概述、环境变量、注释、关键字、标识符、常量

    Java语言的特点         有很多小特点,重点有两个开源,跨平台  Java语言是跨平台的 Java语言的平台         JavaSE         JavaME--Android   ...

  7. java 中特殊的_Java中一些特殊关键字

    transient 被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null. ins ...

  8. java static再赋值_java static变量可以赋值吗?

    详细内容 java static变量可以赋值吗? 可以赋值的.static的主要作用是静态成员,指该变量的实例在内存中之存放一次.赋值是可以随便改的. java中static关键字 static是ja ...

  9. java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

    作者:七里香的编程之路 出自:OSCHINA 原文:my.oschina.net/u/4098550/blog/4548274 能保证可见性的措施 除了volatile 可以让变量保证可见性外.hap ...

最新文章

  1. 黑客与画家:11 一百年后的编程语言
  2. 网络营销外包下字节跳动如此优秀私有市场估值远超拼多多与京东
  3. 自动化工具之二:win32gui
  4. 大一大专计算机考试题型,大专,计算机一级考试考什么内容,麻烦详细点,谢谢。...
  5. Let‘s Play Curling 二分,lower_bound(2020.12.南京)
  6. 【Nginx】Nginx概述
  7. 论文浅尝 | EARL: Joint Entity and Relation Linking for QA over KG
  8. 服务器和硬盘如何区分,服务器硬盘和普通硬盘区别介绍
  9. DQL、DML、DDL、DCL全名是啥?
  10. html中模板引擎—前端与后端
  11. 地震时,它可以救你一命!
  12. hdu 6205: card card card【输入挂】
  13. linux 添加声卡驱动,操作手册:Linux系统安装声卡驱动
  14. 2019年电赛H题电磁炮实录
  15. Bugku CTF 抄错的字符 WP
  16. 关于反转的总结(C/C++)
  17. 《弃子长安》第十一章 一路向西
  18. CAD图纸转为PDF格式打开或打印格式改变怎么办?
  19. 错误: 找不到符号 符号: 方法 getResources() 位置: 类型为String的变量 dataSex
  20. private、fileprivate、public、open

热门文章

  1. 数字电路-八路抢答器的设计(proteus仿真)
  2. linux系统更改刷新率,关于Linux系统中调整刷新率(转)
  3. 算法设计方法:递归的内涵与经典应用
  4. 1.2新版本AION第一手破解版外挂,保证安全
  5. 航顺 HK32F030C8T6 单片机MCU控制器
  6. 955不加班公司名单!最新版...
  7. 计算机论文展望未来,计算机本科毕业论文参考例文.docx
  8. [FireshellCTF2020]Firehttpd
  9. Java多线程编程模式实战指南一:Active Object模式(上)
  10. php学习基础篇之html