static是关键字吗,static关键字的用法

  static是关键字吗,static关键字的用法

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

  如何解决写爬虫IP受阻的问题?立即使用。

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

  静态是Java的50个关键词之一。Static关键字可用于修改代码块以表示静态代码块,修改成员变量以表示全局静态成员变量,以及修改方法以表示静态方法。(注意:除了内部类,普通类是不能修饰的。这是为什么呢?)

  A级

  静态{

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

  }

  静态int I;//静态变量

  静态void方法(){

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

  }

  }简而言之,static关键字修饰的一切都是静态的。

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

  所以当一个类的某个东西不属于对象,而是被对象共享的时候,它就属于这个类,可以考虑是否用static关键字来修饰。

  static关键字的的作用

  1修饰代码块

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

  实例代码块会随着对象的创建而执行,即每个对象都会有自己的实例代码块,说明实例代码块的运行结果会影响当前对象的内容,并随着对象的销毁而消失(内存回收);静态代码块是在Java类装入JVM内存时执行的代码块。因为类的加载在JVM运行期间只发生一次,所以静态代码块只执行一次。

  因为静态代码块的主要作用是执行一些复杂的初始化工作,所以静态代码块和类一起存放在方法区,静态代码块的结果存放在方法区,也就是初始化量存放在方法区,由线程共享。

  2修改成员变量

  类中用static关键字修饰的成员变量称为静态成员变量,因为static不能修饰局部变量(为什么?),所以静态成员变量也可以称为静态变量。静态变量类似于代码块。当一个类被加载到JVM内存中时,JVM会将静态变量放入方法区并分配内存,这些内存也会被线程共享。访问形式是:类名。静态成员名称。

  公共类StaticTest {

  公共静态void main(String[] args) {

  system . out . println(d . I);

  System.out.println(新D()。I);

  }

  }

  D级

  静态{

  I=2;

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

  }

  静态int I;

  }静态变量存储在类的信息中,可以在线程间共享,所以它当然属于类的每一个对象,所以你可以通过对象访问静态变量,但是编译器不支持这个,会给出警告。

  注意:

  类的静态变量和类的静态代码块的加载顺序。类将首先加载静态变量,然后加载静态代码块,但是当有多个静态变量和多个代码块时,它们将按照编写的顺序加载。

  D级

  静态{

  I=2;

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

  }

  静态{

  I=6;

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

  }

  静态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关键字一起使用。

  静态键不能修改局部变量,包括实例方法和静态方法,否则就违背了静态键共享的初衷。

  3修改方法

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

  D级

  静态{

  I=2;

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

  }

  静态final int I;

  int j;

  静态void方法(){

  system . out . println(I);

  System.out.println(新D()。j);

  method 1();

  new D()method 2();

  }

  静态void方法1() {

  system . out . println(I);

  }

  void方法2() {

  system . out . println(I);

  }

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

  也许,你想到了主要的方法。

  没错,main方法被Java规范定义为Java类的主入口。Java类由main方法启动:

  公共静态void main(String[] args) {

  For (String arg: args) {//参数是在外部定义的

  system . out . println(arg);

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

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

  4静态导入

  用import导入包或类时,可以用static修饰包名或类,以表示静态导入。可以对比静态导入和动态导入来加深理解。

  动态导入是指当你的程序需要更新一个不在这个包中的类的对象时,会根据完整路径类名加载该类;静态导入是用类加载来加载静态导入的类,所以是提前导入的。

  公共类StaticTest {

  静态void方法1() {

  system . out . println(“static method 1”);

  }

  静态void方法2() {

  system . out . println(“static method 2”);

  }

  }静态导入:

  导入static com . starry . static import . static test . method 1;

  公共类客户端{

  公共静态void main(String[] args) {

  method 1();//

  static test . method 2();

  }

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

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

  static关键字的缺点

  封装是Java类的三大特征之一,也是面向对象的主要特征。因为可以通过类直接访问类的属性和方法,而不需要对象,所以这会破坏类的封装。因此,除了Utils类之外,应该尽可能少地使用static关键字来修改代码中的变量和方法。以上是静态关键字做什么的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: