参考链接: 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{}语句块相关推荐

  1. Java static关键字与static{}语句块

    目录直通车 一. 类的加载特性与时机 1. 类加载的特性 2. 类加载的时机 二. static的三个常用 1. 修饰成员变量 2. 修饰成员方法 3. 静态块(static{}) 一. 类的加载特性 ...

  2. Java的知识点10——static关键字、静态初始化块、 参数传值机制、包、导入类import、 静态导入

    static 关键字 在类中,用static声明的成员变量为静态成员变量,也称为类变量. 类变量的生命周期和类相同,在整个应用程序执行期间都有效.它有如下特点: 1. 为该类的公用变量,属于类,被该类 ...

  3. static关键字_乐字节Java|this关键字、static关键字、block块

    大家好,乐字节的小乐将会给大家讲述Java继承的内容,一下是Java继承的知识图谱: 一. this关键字 在类的方法定义中使用的this关键字代表使用该方法的对象的引用. this 即"自 ...

  4. [转载] Java 语言中的实例初始化块 ( IIB) 详解

    参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...

  5. java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解

    参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...

  6. Java讲课笔记12:static关键字

    文章目录 零.本讲学习目标 1.掌握静态变量的使用 2.掌握静态方法的使用 3.掌握静态代码块的使用 一.static关键字的用处 二.静态变量 1.静态变量的定义 2.静态变量的内存分配示意图 3. ...

  7. 面向对象基础——static关键字和代码块的使用

    具体内容  在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声 ...

  8. java static是单例_JAVA基础-static关键字及单例设计模式

    static关键字 基本概念使用static关键字修饰成员变量表示静态的含义, 此时成员变量由对象层级提升为类层级, 也就是整个类只有一份并被所有对象共享. 该成员变量随着类的加载准备就绪, 与是否创 ...

  9. java关键字static_Java中的static关键字

    java关键字static static keyword in Java is used a lot in java programming. Java static keyword is used ...

最新文章

  1. 几个不错的开源的.net界面控件
  2. 记一次信息泄露(被美团泄露出去的)和被诈骗经历
  3. Python使用LDAP做用户认证
  4. linux 6.7 nfs安装yum,centos6.7下安装配置NFS
  5. java内容置剪贴板
  6. Android RecyclerView 滑动到指定位置 RecyclerView 滑动到顶部
  7. 女神节福利来了!(自动驾驶/三维重建/SLAM/点云/标定/深度估计/3D检测)
  8. 使用计算机键盘的基本步骤,键盘指法练习方法
  9. win7下好用的虚拟光驱,免安装,体积小
  10. python: 上下文管理器(context manager)
  11. 微博、QQ、微信第三方登录 Java 实现实录
  12. 使用Hutool发送工作日报
  13. win7任务管理器快捷键
  14. 一个 pcie 插槽损坏的 h77n-wifi(BIOS添加nvme模块实现pcie启动操作系统)
  15. 如何用中文编程c++
  16. Nordic新发布nRF21540与RFX2401C和CC2592性能对比
  17. 使用exe4j打包javafx项目
  18. win10 EFI文件夹删除了,引导进不去了,该怎么办?
  19. 一些专业术语的中英文对照
  20. css实现文字的水平垂直居中

热门文章

  1. (五)C语言之二维数组
  2. android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener
  3. await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能
  4. 交换两个数组 差最小 java_如何交换两个等长整形数组使其数组和的差最小(C和java实现)...
  5. strict=False 但还是size mismatch for []: copying a param with shape [] from checkpoint,the shape in cur
  6. java sound 多线程同一音频文件_Java在编程语言中占据何等优势?
  7. 2021年呼和浩特高考段考成绩查询,2019届呼和浩特市高三段考成绩排名分析
  8. android 抓取webview中的所有图片_如何一键提取PDF文档中的所有图片?
  9. 计算机专业知识是什么范围,计算机基础知识考题
  10. 获取html内标题,通过html敏捷包获取标题标签