Java基础(六) static五大应用场景
static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。上一个章节我们讲了final关键字的原理及用法,本章节我们来了解一下static关键字原理及其用法。
一. static特点
static是一个修饰符,通常用于修饰变量和方法,如开发过程中用到的字典类数据都会用到static来修饰,工具类方法,如Dateutils,Stringutils这类工具方法也会用到static来修饰,那么除了这两种最常用的场景外,是否还有其他场景呢,答案是:有的,总共五种:
- static变量
- static方法
- static代码块
- static内部类
- static包内导入
static修饰的变量、方法、代码块、内部类在类加载期间就已经完成初始化,存储在Java Heap(JDK7.0之前存储在方法区)中静态存储区,因此static优于对象而存在。
static修饰的成员(变量、方法)被所有对象所共享,也叫静态变量或静态方法,可直接通过类调用(也建议通过类调用)。
二. static 变量
static变量随着类的加载而存在,随着类的消失而消失,当类被加载时,就会为静态变量在Java Heap中分配内存空间,可以通过【类.变量名】和【对象.变量名】的方式调用,建议直接使用【类.变量名】的方式,
public class Person {
private String name;
private static int eyeNum;
public static int legNum = 2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int getEyeNum() {
return eyeNum;
}
public static void setEyeNum(int eyeNum) {
Person.eyeNum = eyeNum;
}
}
public static void main(String[] args) {
Person person = new Person();
person.setEyeNum(25);
Person person1 = new Person();
person1.setEyeNum(28);
System.out.println(person.getEyeNum());//28
System.out.println(person1.getEyeNum());//28
int legNum = person.legNum;
System.out.println(legNum);//2
}
从上面的例子可以看出静态变量是对所有对象共享,一个对象对其值的改动,直接就会造成另一个对象取值的不同。
什么时候使用static变量?
作为共享变量使用,通常搭配final关键字一起使用,比如我们常用的字典类数据;
private static final String GENERAL_MAN = "man";
减少对象的创建,比如在类开头的部分,定义Logger方法,用于异常日志采集
private static Logger LOGGER = LogFactory.getLoggger(MyClass.class);
始终返回同一变量,比如我们的单例模式。
三. static 方法
静态方法只能访问静态成员(静态变量、静态方法),而非静态方法既可访问静态方法也可访问非静态方法;因为静态成员优于对象而存在,因此无法调用和对象相关的关键字,如this,super,无法通过关键字访问对象资源。
public class Person {
private String name;
private static int eyeNum;
public static int legNum = 2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int getEyeNum() {
System.out.println(name);//编译出错,name不可用
return eyeNum;
}
public static void setEyeNum(int eyeNum) {
Person.eyeNum = eyeNum;
this.name = "";//编译出错,this不可用
}
}
什么时候使用static方法?
static方法一般用于与当前对象无法的工厂方法、工具方法。如Math.sqrt(),Arrays.sort(),StringUtils.isEmpty()等。
四. static 代码块
static代码块相对于static变量和static方法来说使用不是那么广泛,但也算是比较常见的用法了,static代码块在加载一个类的时候最先执行,且只执行一次。
public static Map<String, String> timeTypes;
static {
timeTypes = new HashMap<>();
timeTypes.put("year", "年");
timeTypes.put("quarter", "季");
timeTypes.put("month", "月");
timeTypes.put("day", "日");
System.out.println("初始化1");
}
public static void main(String[] args) {
System.out.println("初始化2");
}
执行结果是:
初始化1;
初始化2;
什么时候使用static代码块?
一般在进行初始化操作时,比如读取配置文件信息,获取当前服务器参数等
五. static内部类
定义一个内部类,加上static,就成为了一个static内部类,static只能修饰内部类,不能修饰顶级类,静态内部类在业务应用系统开发中使用的不多。
public class StaticCouter {
private String str0 = "hi"; //非静态变量
private static String str1 = "hello"; //静态变量
static class StaticInnerClass{//静态内部类
public void getMessage(){
System.out.println(str0);//编译出错
System.out.println(str1);
}
}
class NormalInnerClass{//非静态内部类
public void getMessage(){
System.out.println(str0);
System.out.println(str1);
}
}
}
静态内部类与非静态内部类有何异同?
| 静态内部类 | 非静态内部类 |
|---|---|
| 不需要有指向外部类的引用 | 必须通过外部类的new关键字引用 |
| 可定义普通变量和方法,也可定义静态变量和方法 | 可定义普通变量和方法,不可定义静态变量和方法 |
| 可以调用外部类的静态成员,不能调用外部类的普通成员 | 可调用外部类的普通成员和静态成员 |
public static void main(String[] args) {
//创建静态内部类实例
StaticInnerClass staticInnerClass = new StaticInnerClass();
//调用静态内部类方法
staticInnerClass.getMessage();
//创建静态内部类实例
StaticCouter.StaticInnerClass staticInnerClass1 = new staticCouter.StaticInnerClass();
//调用静态内部类方法
staticInnerClass1.getMessage();
//创建普通内部类实例
StaticCouter.NormalInnerClass normalInnerClass = new StaticCouter().new NormalInnerClass();
//调用普通内部类方法
normalInnerClass.getMessage();
}
六. static包内导入
这个概念不太好理解,举个例子
public static void main(String[] args) {
int[] arra = {1,4,5,7};
Arrays.sort(arra);
Arrays.asList(arra);
Arrays.fill(arra, 6);
}
static包导入目的就是去掉重复的Arrays类名调用
通过在顶部引入
import static java.util.Arrays.*
即可把Arrays类中所有的静态变量,方法,内部类等都引入当前类中,调用时直接调用sort(arra),asList(arra),
java5后引入的,不常用,调用类方法时会比较简单,但可读性不好,慎用。
七. 总结
static是java中很常用的一个关键字,使用场景也很多,本文主要介绍了它的五种用法,static变量,static方法,static代码块,static内部类,static包内导入,若有不对之处,请批评指正,望共同进步,谢谢!
Java基础(六) static五大应用场景的更多相关文章
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
- Java基础之static关键字的用法
Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例. 静态(static)可以是: 变量 ...
- java基础 -- 关键字static的用法
static关键字的基本作用就是方便在没有创建对象的情况下调用类的方法/变量, static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. static ...
- java基础(六)-----String性质深入解析
本文将讲解String的几个性质. 一.String的不可变性 对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了.然而,String对象一经创建就不可以修改 ...
- java基础(六) switch语句的深入解析
引言 switch 语句是非常的基础的知识,掌握起来也不难掌握,语法比较简单.但大部分人基本是知其然,不知其所以然.譬如 早期JDK只允许switch的表达式的值 int及int类型以下的基本类型 ...
- 【Java基础】static关键字相关
static关键字特点: 随着类的加载而加载. 优先于对象存在. 被所有对象共享 可以直接被类名调用. 使用注意: 静态方法只能访问静态成员. 但非静态成员可以访问静态成员. 静态方法中不能使用thi ...
- Java 基础之 static 静态
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- 【Java基础】 static
static static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念.被 ...
- Java基础(二)-static关键字分析
static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...
随机推荐
- #上海ORACLE用户组2014在论坛#时刻
#上海ORACLE用户组2014年高峰论坛#精彩瞬间 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNrbWFjbGVhbg==/font/5a6L5L ...
- CSRF的攻击与防御
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- 冒泡排序 和 选择排序的 区别 python
参考:https://www.cnblogs.com/banana201/p/4928733.html ## 冒泡排序法(Bubblesort) ## 所谓排序法,就是对一组无序的序列进行有序的排序( ...
- Windows多线程系列
来自CSDN - 秒杀多线程系列.覆盖了Windows系统的线程同步机制.对于理解各种锁以及多线程典型场景很有帮助.
- win10家庭版连接不上远程桌面
解决方案来自于:https://blog.csdn.net/weixin_39129504/article/details/80303615 这个解决方案的关键: done!不知是否侵权 如有侵权 ...
- linux 下Eclipse for C/C++的不常见设置
设置1:build project的时候,让编译器支持 三字母词. 项目文件右击--> Properties-->C/C++ Build--> Settings 如图设置: 再 C ...
- matlab 高阶(二) —— 数值、溢出问题的解决
gammaln() 在处理上溢和下溢方面要比 log(gamma()) 更好: log1p() (1 plus)对于较小的 x 值时,log1p(x) 要比 log(1+x) 更为精确: 当 x 取值 ...
- (转)总结:JavaScript异步、事件循环与消息队列、微任务与宏任务
前言 Philip Roberts 在演讲 great talk at JSConf on the event loop 中说:要是用一句话来形容 JavaScript,我可能会这样: “JavaSc ...
- DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版发布
关于 DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...
- 通通玩blend美工(2)——时钟
原文:通通玩blend美工(2)--时钟 谢谢大家对我上一篇Blend的支持:通通玩blend美工(1)——荧光Button 再接再厉再来一篇~~! 这篇是建立在已经看得懂上一篇为基础来写的,有些细节 ...