[转载] Java static关键字与static{}语句块
参考链接: Java中的静态块static block
目录直通车
一、 类的加载特性与时机
1、 类加载的特性
2、 类加载的时机
二、 static的三个常用
1、 修饰成员变量
2、 修饰成员方法
3、 静态块(static{})
一、 类的加载特性与时机
在进入static之前,先补一下关于类的脑。
1、 类加载的特性
在JVM的生命周期里,每个类只会被加载一次。
类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。
2、 类加载的时机
1)第一次创建对象要加载类.
2)调用静态方法时要加载类,访问静态属性时会加载类。
3)加载子类时必定会先加载父类。
4)创建对象引用不加载类.
5) 子类调用父类的静态方法时
(1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
(2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。
二、 static的三个常用
1、 修饰成员变量
2、 修饰成员方法
同C++是一样的概念。但是在JVM里面,JVM也会划分一个暂称静态存储区,用于存放方法的定义。实际上从更大的角度而言,它存放的是各种类的定义,当我们通过new来生成对象时,会根据这里定义的类的定义去创建对象。
下面观察两段代码的输出结果,加了static和没有加static的区别:
public class Person {
String name;
int age;
public String toString() {
return "Name:" + name + ", Age:" + age;
}
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "zhangsan";
p1.age = 10;
Person p2 = new Person();
p2.name = "lisi";
p2.age = 12;
System.out.println(p1);
System.out.println(p2);
}
/**输出结果
* Name:zhangsan, Age:10
* Name:lisi, Age:12
*/
}
public class Person {
String name;
// 给age加上static
static int age;
/* 其余代码不变... */
/**输出结果
* Name:zhangsan, Age:12
* Name:lisi, Age:12
*/
}
结论:通过运行结果,可以看到 age都为12,只保存了最后一次给age赋的值。这是为什么呢,在内存里面发生了什么?
给age属性加了static关键字之后,Person对象就不再拥有age属性了,age属性会统一交给Person类去管理,即多个Person对象只会对应一个age属性,一个对象如果对age属性做了改变,其他的对象都会受到影响。
3、 静态块(static{})
(1) static关键字还有一个比较关键的作用,用来形成静态代码块(static{}(即static块))以优化程序性能。
(2) static块可以置于类中的任何地方,类中可以有多个static块。
(3) 在类初次被加载的时候执行且仅会被执行一次(这是优化性能的原因!!!),会按照static块的顺序来执行每个static块,一般用来初始化静态变量和调用静态方法。
下面通过两段代码,说明 static{} 为什么能优化程序性能。
实例
/**
* 每次调用isBornBoomer的时候
* 都会生成startDate和birthDate两个对象,造成了空间浪费
*/
class Person{
private Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
Date startDate = Date.valueOf("1997");
Date endDate = Date.valueOf("2019");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
/**
* 这里使用了static块
* 只需要进行一次的初始化操作
* 节省内存空间,优化性能
*/
class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1997");
endDate = Date.valueOf("2019");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
注意:强调一下static块是会按照顺序执行,与main入口函数无关。
static还有一个不常用的用途,叫做 static静态导包 。有兴趣的朋友可以去了解一下。
[转载] Java static关键字与static{}语句块相关推荐
- Java static关键字与static{}语句块
目录直通车 一. 类的加载特性与时机 1. 类加载的特性 2. 类加载的时机 二. static的三个常用 1. 修饰成员变量 2. 修饰成员方法 3. 静态块(static{}) 一. 类的加载特性 ...
- Java的知识点10——static关键字、静态初始化块、 参数传值机制、包、导入类import、 静态导入
static 关键字 在类中,用static声明的成员变量为静态成员变量,也称为类变量. 类变量的生命周期和类相同,在整个应用程序执行期间都有效.它有如下特点: 1. 为该类的公用变量,属于类,被该类 ...
- static关键字_乐字节Java|this关键字、static关键字、block块
大家好,乐字节的小乐将会给大家讲述Java继承的内容,一下是Java继承的知识图谱: 一. this关键字 在类的方法定义中使用的this关键字代表使用该方法的对象的引用. this 即"自 ...
- [转载] Java 语言中的实例初始化块 ( IIB) 详解
参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...
- java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解
参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...
- Java讲课笔记12:static关键字
文章目录 零.本讲学习目标 1.掌握静态变量的使用 2.掌握静态方法的使用 3.掌握静态代码块的使用 一.static关键字的用处 二.静态变量 1.静态变量的定义 2.静态变量的内存分配示意图 3. ...
- 面向对象基础——static关键字和代码块的使用
具体内容 在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声 ...
- java static是单例_JAVA基础-static关键字及单例设计模式
static关键字 基本概念使用static关键字修饰成员变量表示静态的含义, 此时成员变量由对象层级提升为类层级, 也就是整个类只有一份并被所有对象共享. 该成员变量随着类的加载准备就绪, 与是否创 ...
- java关键字static_Java中的static关键字
java关键字static static keyword in Java is used a lot in java programming. Java static keyword is used ...
最新文章
- 几个不错的开源的.net界面控件
- 记一次信息泄露(被美团泄露出去的)和被诈骗经历
- Python使用LDAP做用户认证
- linux 6.7 nfs安装yum,centos6.7下安装配置NFS
- java内容置剪贴板
- Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部
- 女神节福利来了!(自动驾驶/三维重建/SLAM/点云/标定/深度估计/3D检测)
- 使用计算机键盘的基本步骤,键盘指法练习方法
- win7下好用的虚拟光驱,免安装,体积小
- python: 上下文管理器(context manager)
- 微博、QQ、微信第三方登录 Java 实现实录
- 使用Hutool发送工作日报
- win7任务管理器快捷键
- 一个 pcie 插槽损坏的 h77n-wifi(BIOS添加nvme模块实现pcie启动操作系统)
- 如何用中文编程c++
- Nordic新发布nRF21540与RFX2401C和CC2592性能对比
- 使用exe4j打包javafx项目
- win10 EFI文件夹删除了,引导进不去了,该怎么办?
- 一些专业术语的中英文对照
- css实现文字的水平垂直居中
热门文章
- (五)C语言之二维数组
- android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener
- await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能
- 交换两个数组 差最小 java_如何交换两个等长整形数组使其数组和的差最小(C和java实现)...
- strict=False 但还是size mismatch for []: copying a param with shape [] from checkpoint,the shape in cur
- java sound 多线程同一音频文件_Java在编程语言中占据何等优势?
- 2021年呼和浩特高考段考成绩查询,2019届呼和浩特市高三段考成绩排名分析
- android 抓取webview中的所有图片_如何一键提取PDF文档中的所有图片?
- 计算机专业知识是什么范围,计算机基础知识考题
- 获取html内标题,通过html敏捷包获取标题标签