Java中的static关键字解析

—,static的用途。
 在《Java编程思想》有这样一段话:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之就是方便在没有对象的情况下来调用方法或者变量。因为 static修饰过的变量或者方法不需要依赖与对象进行访问只要类被加载了就可以直接通过类名进行访问。而且还可以通过编写 static代码块来优化优化程序(初始化的作用)。
static方法称作静态方法,由于它不依赖于对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,引申一点就是关于类的构造器是否是static方法有很多争议,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。在类的构造器中,实际上有一个隐藏的参数this引用,this是跟对象绑定的,也就是说在调用构造器之前,这个对象已经创建完毕了才能出现this引用。而构造器的作用是干什么的呢?它负责在创建一个实例对象的时候对实例进行初始化操作,即jvm在堆上为实例对象分配了相应的存储空间后,需要调用构造器对实例对象的成员变量进行初始化赋值操作。而static不需要对象就可以访问也就是说和this是没有任何关系的。所以构造方法不是static。我们还可以从 JVM指令层面去看类的构造器不是static方法。
在这里插入图片描述
在这里插入图片描述

从上面可以看出,在调用static方法是调用的是invokestatic指令,而在调用类的构造器时实际上执行的是invokespecial指令。下面是官方文档对于这两个的解释,
可以看出,这2个指令的用途是完全不同的,invokestatic定义很清楚,就是用来调用执行static方法,而invokespecial用来调用实例方法,用来特殊调用父类方法、private方法和类的构造器。
在这里插入图片描述

虽然static不能访问非static变量/方法但是非static方法/变量可以访问static的方法/变量的。
二,static变量
static变量也称作静态变量,静态变量和非静态变量的区别是,静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。而且static成员变量的初始化顺序按照定义的顺序进行初始化(父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器))。
三,static代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次(只会在类加载的时候执行一次)。所以很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行效率会更好。
四,static关键字的误区。
1静态方法来说没有this,那么在非静态方法中能够通过this访问静态成员变量吗?
在这里插入图片描述

上面这幅图执行结果是3还是33呢?通过我们对this的了解。调用是当前对象的,而print1value里面的vlue明显是局部变量根本不可能与this关联,因此在printValue中的this.value的值毫无疑问是33。所以总结一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值