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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。