static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。上一个章节我们讲了final关键字的原理及用法,本章节我们来了解一下static关键字原理及其用法。

一. static特点

static是一个修饰符,通常用于修饰变量和方法,如开发过程中用到的字典类数据都会用到static来修饰,工具类方法,如Dateutils,Stringutils这类工具方法也会用到static来修饰,那么除了这两种最常用的场景外,是否还有其他场景呢,答案是:有的,总共五种:

  1. static变量
  2. static方法
  3. static代码块
  4. static内部类
  5. 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());//28System.out.println(person1.getEyeNum());//28int 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包内导入,若有不对之处,请批评指正,望共同进步,谢谢!

转载于:https://www.cnblogs.com/LiaHon/p/11075178.html

Java基础(六) static五大应用场景相关推荐

  1. Java基础之static关键字的用法

    Java中的static关键字主要用于内存管理.我们可以应用static关键字在变量.方法.块和嵌套类中. static关键字属于类,而不是类的实例.         静态(static)可以是: 变 ...

  2. 25天掌握java基础(八)——static、单例、代码块、继承

    文章目录 Demo08-static.单例.代码块.继承 1.static 1.1static静态关键字 1.1.1static修饰成员变量 1.1.2static修饰成员方法 1.1.3static ...

  3. java基础(六) switch语句的深入解析

    引言   switch 语句是非常的基础的知识,掌握起来也不难掌握,语法比较简单.但大部分人基本是知其然,不知其所以然.譬如 早期JDK只允许switch的表达式的值 int及int类型以下的基本类型 ...

  4. Java 基础之 static 静态

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  5. Java基础-day08-static·static静态代码块·final 关键字·多态·汽车设计综合案例·异常

    day09 1.static 是java中的一个关键字 用于修饰成员(成员变量和成员) 1.static是一个关键字 2.static可以修饰成员变量和方法,被修饰的资源就是静态资源 3.静态资源优先 ...

  6. 【Java基础】static初始化块

    初始化块 当Java创建对象时,系统总是先调用该类里定义的初始化块.如果一个类定义了两个初始化块,则前面定义的初始化块先执行,后面定义的初始化块后执行. 初始化块只在创建Java对象时隐式执行,不能显 ...

  7. java基础(六)正则表达式

    You got a dream, you gotta protect it. People can't do something themselves,they wanna tell you you ...

  8. 第一阶段>>>Java基础进阶 OOP/Reflect/注解/IO流/API核心

    目录 >>>java基础01-结构以及类型 >>>java基础02-初识数组 >>>java基础03-面向对象OOP >>>ja ...

  9. 你所需要的java基础篇深入解析大汇总

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

最新文章

  1. 梦幻西游手游服务器维护时段,梦幻西游手游2018合区时间服务器汇总详解
  2. 【转】Android 快捷方式的创建
  3. node.js初探-超越昨天的自己系列(3)
  4. Hadoop 停止hdfs和yarn的命令
  5. ubuntu中文文件名乱码
  6. CodeMirror 5.46.0 发布,多功能在线代码编辑器
  7. 结巴分词优点_中文分词概述及结巴分词原理
  8. 损失函数梯度对比-均方差和交叉熵
  9. oracle修改数据库国际字符集,Oracle修改数据库字符集
  10. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5
  11. python和pycharm要安装在同一个路径下吗_无法在pyCharm中导入与Anaconda一起安装的文件:需要将Anaconda添加到Python路径吗?...
  12. 把CheckBox的方块换成图片或其他
  13. CodeDom系列--事件(event)定义和反射调用
  14. ubuntu find 文件时权限不够
  15. 百度宣布服务器硬盘,百度秘密拆空服务器硬盘改用SSD 谷歌与网易有道回应
  16. 浏览器兼容性测试及常见问题
  17. una到底啥意思_una到底啥意思_Una_英文名Una是什么意思
  18. MacBookpro连不上WiFi,网络增加新的位置解决
  19. 建议收藏 | IC专业术语盘点
  20. Spark 基础教程

热门文章

  1. oracle with和insert结合使用
  2. 【codevs3324】新斯洛克
  3. ICML 2022 第一届关于新冠病毒的智慧医疗研讨会
  4. MobileFormer-在目标检测任务上怒涨8.6 AP,微软新作MobileFormer
  5. 电商标识检测的鲁棒性防御,ACM MM2021 安全AI大赛技术解析
  6. 光流估计——从传统方法到深度学习
  7. linux服务器开发板,linuxnfs服务器的建立,虚拟机、开发板间的通信
  8. 量子科技概念大火,国内现状如何?华为BAT均入局量子计算
  9. 笔记 | 《机器学习》中特征选择与稀疏学习
  10. 学习 |《神经网络与深度学习》的讲义