java static关键字_java之static关键字

709a29dd43d21a15a4231299fe916ae1.png

static修饰符

static修饰符能够与属性、方法和内部类一起使用,表示是“静态”的。

类中的静态变量和静态方法能够与“类名”一起使用,不需要创建一个类的对象来访问该类的静态成员。所以static修饰的变量又叫做“类变量”。这与实例变量不同。实例变量总是用对象来访问,因为他们的值在对象和对象之间有所不同。

举例如下:

public 

305827d652c2b641a342ab40fa131827.png
类变量可以直接访问

可以看出,对于静态变量s,我们没有创建实例,就能直接访问它。那如果是实例去访问呢?

public 

9e509bbf9f742050dba0fbfdb668c7c0.png
实例也可以访问类变量

事实上,对于静态方法也是如此:

public 

731354d61f91ca116f9348949dc81d6a.png

从两种不同的方式去访问或者调用类的静态成员时,我们肯定会尽量少的去创建实例(需要耗内存)来访问或调用类的静态成员,而采取直接调用的方式。

static属性的内存分配

一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。

public 

546bf4a31b98ea8bcf000edfcb67c981.png
静态变量被多个实例所共享

共享的概念我结合这段代码画出内存分配图解释一下:

75e797b77d69e943d799a64538cd6121.png
共享时内存示意图

当我们创建了类属性s=“静态属性被多个实例所共享!”后,当类装载后就会在内存中便会为这个Test类划分出一块静态存储区,里面存放的s的值,当我们分别创建实例t和t1后,在堆内存中则存放着他们各自的实例属性,以及关于s的引用,它们都指向了静态存储区的s,因此当我们改变s的值后,t.s和t1.s指向的值都会改变。

static属性变量的初始化

static的变量是在类装载的时候就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static变量,它都会被初始化。简而言之,它在创建对象的之前,就会被初始化,且只被初始化一次。

static基本规则

1、一个类的静态方法只能访问静态属性
2、一个类的静态方法不能直接调用非静态方法
3、如果访问控制权限允许,static属性和方法可以是用类名加“.”的方式调用;当然也可以使用实例加“.”方式调用
4、静态方法中不存在当前对象,因此不能使用this关键字,当然也不能使用super
5、静态方法不能被非静态方法覆盖
6、构造方法不允许声明为static
注:非静态方法只限于实例,并只能通过实例引用被访问。

静态初始器——静态块

静态初始器(Static Initializer)是一个存在于类中方法外面的静态块。静态初始器仅仅在类装载的时候(第一次使用类的时候)执行一次。

静态初始器的功能:通常用来初始化静态的类属性。

参考理解可以看这位博主的博客:

[java]static关键字的四种用法 - dotgua - 博客园​www.cnblogs.com
8fd6997288357967f0dbd8f1177d5da3.png

静态import

85e764be660630872fd09c0334b03a26.png
静态import

总结如下:static的四种用途

1、用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享。
2、用来修饰成员方法,将其变为类方法,可以直接使用 “类名.方法名”的方式调用,常用于工具类。
3、静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键。
4、静态导包用法,将类的方法直接导入到当前类中,从而直接使用 “方法名”即可调用类方法,更加方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值