搜索
写经验 领红包
 > 家居

javastatic关键字的用法(java的static关键字)

导语:Java static 关键字详解

java static关键字的用法(java的static关键字)

在Java中定义了一个static关键字,可以用于修饰类的成员,如成员变量。成员方法以及代码块等,被static 修饰的成员就别一些特殊性,如下:

静态变量

在一个类中,主要的组成就是属性和方法,在每一个对象都分别拥有各自的属性内容,如果现在在类中某个属性希望定义为公共属性-所有对象都可以使用的属性,则可以在声明属性前加上 static 关键字。

public class Person {    private String name;    private int age;    static String country = &34;;    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public static void main(String[] args) {        Person per1 = new Person(&34;,20);        Person per2 = new Person(&34;,21);        Person per3 = new Person(&34;,22);            }}

上面对象在内存中会怎样实现的呢?

通过上图可发现,由于static属性保存在了全局数据区中,所以现在如果有一个对象修改了 country 属性的内容,那么势必会影响其他对象的 country 属性内容。

既然staitc 定义的属性表示的公共属性,那么如果现在由某一个对象修改是不合适的,应该由所有对象的公共代表-类来进行操作,即staitc 属性最好直接通过类名称来进行调用,使用 “类名称.static属性” 的方式来完成。

总结

使用static定义的属性不再堆内存中保存,而是保存在全局数据区使用static定义的属性表示类属性,类属性可以有类名称直接进行调用。static 属性虽然定义在类中,但是其可以在没有实例化对象时进行调用(普通属性保存在堆内存里,而static 属性保存在全局数据区中)

我们通过JVM 加载类的过程来说明static 是在哪个阶段进行初始化的

我们看准备阶段:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量锁使用的内存都将在方法区中进行分配,这个时候进行内存分配的仅包含类变量,而不包括实例变量,实例变量将会在对象实例化随着对象一起分配在java堆中。其次,这里所说的初始化通常情况下是数据类型的零值。具体值的初始化将会在初始化阶段才执行。

如果定义一个类变量:public static int age = 21;此时在这个阶段 age = 0

初始化阶段类初始化阶段是类加载过程的最后一步,在准备阶段,变量已经赋值过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,初始化阶段是执行类构造器clinit()方法的过程。此时 age = 20

静态方法

静态方法又称为类方法。当类加载后,即分配了相应的内存空间;由于生命周期的限制,使用静态方法需要注意一下两点:(1) 静态方法中不能使用实例成员变量和实例方法(2) 静态方法中不能使用super 和 this关键字,这两个关键字指代的都是需要被创建出来的对象。

通常静态方法用于定义工具类的方法等,静态方法如果使用了可修改的对象,那么在并发时会存在线程安全问题,所以,工具类的静态方法与单例通常是相伴而生的。

静态代码块

在代码的执行方法体中,非静态代码块和静态代码块比较特殊。非静态代码块又称为局部代码块,是极不推荐的处理方式。而静态代码块在类加载的时候就调用,并且只执行一次。静态代码块时先于钩子凹方法执行的特殊代码块。静态代码块不能存在于任何方法体内,包括类静态方法和属性变量

public class Person {    static {        System.out.println(&34;);    }    {        System.out.println(&34;);    }    public Person(){        System.out.println(&34;);    }    public static void main(String[] args) {         new Person();    }}

结果:

静态代码块.....普通代码块.....构造方法......

静态 代码块和静态变量没有先后关系,在实际应用中例如容器初始化时,可以使用静态代码块实现类加载判断、属性初始化、环境配置等。很多容器框架会在单例对象初始化成功后调用默认的init方法,例如RPC注册中心服务器判断、应用通用底层数据初始化等工作,某框架的初始化代码如下:

public class RPcProviderBean {        public void init(){        this.initRegister();        this.publish();    }    private void publish() {    }    private void initRegister(){}}

本文内容由小馨整理编辑!