首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java中static关键字的作用_Java:Java中static关键字作用

java中static关键字的作用_Java:Java中static关键字作用

作者头像
全栈程序员站长
发布于 2022-09-08 04:22:55
发布于 2022-09-08 04:22:55
8880
举报

大家好,又见面了,我是你们的朋友全栈君。

static关键字最基本的用法是:

1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来

2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来

3、被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的。

@ JDK把不同的静态资源放在了不同的类中为什么不把所有静态资源放在一个类里面呢?

主要有以下几个原因:

1、不同的类有自己的静态资源,这可以实现静态资源分类。比如和数学相关的静态资源放在java.lang.Math中,和日历相关的静态资源放在java.util.Calendar中,这样就很清晰了

2、避免重名。不同的类之间有重名的静态变量名、静态方法名也是很正常的,如果所有的都放在一起不可避免的一个问题就是名字重复,这时候怎么办?分类放置就好了。

3、避免静态资源类无限膨胀,这很好理解。

静态方法不可以引用非静态资源

例如下面代码:

public class A

{

private int i = 1;

public static void main(String[] args)

{

//报错,静态方法内不能引用非静态属性

i = 1;

}

}

非静态方法里面可以引用静态资源

示例:

public class A

{

//静态属性

private static int i = 1;

//非静态方法

public void main(String[] args)

{

i = 1;

}

}

静态资源属于类,但是独立于类存在的。从JVM的类加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。

静态块

静态块也是static的重要应用之一。也是用于初始化一个类的时候做操作用的,和静态变量、静态方法一样,静态块里面的代码只执行一次,且只在初始化类的时候执行。

需要注意的三点:

1、Static修饰的方法执行顺序是怎么样的?

public class A

{

private static int a = B();

static

{

System.out.println(“Enter A.static block”);

}

public static void main(String[] args)

{

new A();

}

public static int B()

{

System.out.println(“Enter A.B()”);

return 1;

}

}

输出结果:

Enter A.B()

Enter A.static block

结论:静态资源的加载顺序是严格按照静态资源的定义顺序来加载的。

2、静态变量的赋值与创建

public class A

{

static

{

c = 3;

//报错

System.out.println(c);

}

private static int c;

}

报错信息“Cannot reference a field before it is defined”。

结论:静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问。

3、继承类中静态代码块的加载顺序

public classA

{static{

System.out.println(“A.static block”);

}publicA()

{

System.out.println(“A.constructor()”);

}

}

public class B extendsA

{static{

System.out.println(“B.static block”);

}publicB()

{

System.out.println(“B.constructor()”);

}public static voidmain(String[] args)

{newB();newB();

}

}

输出结果:

A.staticblock

B.staticblock

A.constructor()

B.constructor()

A.constructor()

B.constructor()

结论:静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次。

注意:static一般情况下来说是不可以修饰类的,如果static要修饰一个类,说明这个类是一个静态内部类(注意static只能修饰一个内部类),也就是匿名内部类。

import static

这个比较冷门,基本很少看见有地方用,使用JUnit可能会用到,写assert的时候会方便些。import static是JDK1.5之后的新特性,这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名.资源名,可以直接使用资源名。注意一下,import static必须这么写,而不能写成static import。举个例子来看一下:

import static java.lang.Math.*;

public class A

{

public static void main(String[] args)

{

System.out.println(sin(2.2));

}

}

这样写意味着我导入了Math下的所有静态资源,main函数里面我就可以直接用sin(2.2)而不需要使用Math.sin(2.2)了。注意一下,要写import static java.lang.Math.*,最后的“.*”不可少,有了这两个字符才意味着导入的是Math下的所有静态资源,写成import static java.lang.Math是有问题的。当然,我们也可以指定只导入某个静态资源,比如只导入Math下sin这个方法而不导入Math下的所有静态资源:

import staticjava.lang.Math.sin;public classA

{public static voidmain(String[] args)

{

System.out.println(sin(2.2));

}

}

对于import static,个人的态度是:

1、简化了一些操作,比如静态导入Math下的所有静态资源,在频繁使用Math类下静态资源的地方,可以少些很多“Math.”

2、降低了代码的可读性

建议在某些场景下导入特定的静态资源,不建议使用“.*”的导入方式。

知识点:

1、Java中的static关键字不会影响到变量的变量或者方法的作用域。

2、虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态方法成员变量。

示例:

public class Test {

//静态变量

static int value = 11;

//静态方法

public static void main(String[] args) {

new Test().printValue();

}

//非静态方法

private void printValue() {

int value = 22;

//运用this访问静态变量

System.out.println(this.value);

}

}

输出结果为:11

这里的this表示的是当前对象,那么通过new Test()来调用printValue的话,当前对象就是通过new Test()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是11。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156764.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hutool官网(hutool好用吗)
看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:
全栈程序员站长
2022/07/28
18.6K0
hutool官网(hutool好用吗)
Hutool工具包-常用开发工具类(让代码更简洁)
Java微观世界
2025/01/20
6450
Hutool工具包-常用开发工具类(让代码更简洁)
带你认识Hutool工具包
Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以 “甜甜的”。
程序员Leo
2023/08/07
1K0
带你认识Hutool工具包
4hutool实战:DateUtil-格式化时间[通俗易懂]
java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案(万字长文*建议收藏)
全栈程序员站长
2022/07/01
4.3K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
参考 https://blog.csdn.net/duan196_118/article/details/111597682 https://blog.csdn.net/qq_24754061/article/details/95500209 https://xijia.blog.csdn.net/article/details/106007147
时间静止不是简史
2023/02/23
5.2K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
LocalDateTime、Date时间工具类
参考:Date、LocalTime、LocalDate、LocalDate-时间操作工具类_Hatsune_Miku_的博客-CSDN博客
CBeann
2023/12/25
3760
java最全最常用的日期工具类(随时补充)
@Slf4j public final class DateUtils { private DateUtils() { } private static final String FORMAT_YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss"; public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd"; public static final String FORMAT_
疯狂的KK
2023/04/10
1.3K0
日期工具类-操作字符串和Date、LocalDate互转,两个日期的时间差等
避免重复造轮子,相关方法基于hutool日期时间工具封装并做部分增强。需要先引入如下坐标
共饮一杯无
2022/11/28
1.4K0
【最爽的日期工具包LocalDate·超爽,超实用】(Java8版本)
需要的包: import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; import j
红目香薰
2022/11/28
7250
JDK8中新的日期时间工具类真的很好用,还不清楚的快进来看看吧,建议收藏
  最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下新的日期时间API。
用户4919348
2021/06/11
1.7K0
Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
学习自http://blog.csdn.net/u012150179/article/details/34486677
十四君
2019/11/27
8620
有了它,Java语法也可以变得甜甜的
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
wangweijun
2020/02/14
1.2K0
APP热搜榜接口提供 --- 百度
目的地-Destination
2024/08/07
2991
APP热搜榜接口提供 --- 百度
JDK8时间工具类
JDK8添加了java.time包,提供了很多方便。 用得比较多的几个类: Instant 在时间线上模拟单个瞬时点 Duration 以秒和纳秒为单位模拟一个数量或时间量。可以使用其他基于持续时间的单位访问它,例如分钟和小时 LocalDate 表示ISO-8601日历系统中没有时区的日期,例如 2019-03-31 LocalTime 表示ISO-8601日历系统中没有时区的时间,例如 16:50:30 LocalDateTime 表示ISO-8601日历系统中没有时区的日期时间,例如 2019-03-31T10:15:30 其中一些方法使用如下:
GreizLiao
2019/09/29
9470
【Java 基础篇】Java Date 类详解:日期和时间操作的利器
在 Java 编程中,处理日期和时间是一项常见但复杂的任务。Java 提供了许多用于日期和时间操作的类,其中 java.util.Date 类是最早的日期和时间类之一。然而,它存在一些问题,因此 Java 8 引入了 java.time 包,其中包含了 java.time.LocalDate、java.time.LocalTime 和 java.time.LocalDateTime 等新的日期时间类。这些新类提供了更多的功能和更好的可读性,使日期和时间处理变得更加方便。本篇博客将详细介绍 Java 中的 java.time 包,重点关注 LocalDate、LocalTime 和 LocalDateTime 类的使用。
繁依Fanyi
2023/10/12
1.5K0
【Java 基础篇】Java Date 类详解:日期和时间操作的利器
手机移动端日期时间控件lcalenda
http://618cj.com/2017/01/16/%E6%89%8B%E6%9C%BA%E7%A7%BB%E5%8A%A8%E7%AB%AF%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E6%8E%A7%E4%BB%B6lcalenda/
全栈程序员站长
2022/08/31
2K0
对接声网rtc-restful-api
阿超
2023/11/18
2430
求求你了,不要再自己实现这些逻辑了,开源工具类不香吗?
最近公司来了一批实习生,小黑哥负责带一个。这位小师弟说实话,基本功很扎实,做事也非常靠谱,深得小黑哥真传。
andyxh
2020/05/19
9960
探索java中的hutools工具库
Hutools是一个Java工具库,提供了丰富的工具模块,可以帮助开发人员简化日常开发任务,并提高工作效率。下面是一些在工作中常用的Hutools工具模块,会用到一些时间处理。或者一些ID生成。获得一些字符判断等非常常用的一些工具类。Hutools都做了一个非常漂亮的简化处理。也是新手值得非常学习的编码工具类
查拉图斯特拉说
2024/01/22
1.1K2
Java8时间方法LocalDate和LocalDateTime工具类
目的地-Destination
2023/10/12
5640
推荐阅读
相关推荐
hutool官网(hutool好用吗)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档