【java基础】static关键字--静态块

在说明static关键字的第三个用法时,我们有必要重新梳理一下一个对象的初始化过程。以下面的代码为例:

package com.dotgua.study;

class Book{

public Book(String msg) {

System.out.println(msg);

}

}

public class Person {

Book book1 = new Book("book1成员变量初始化");

static Book book2 = new Book("static成员book2成员变量初始化");

public Person(String msg) {

System.out.println(msg);

}

Book book3 = new Book("book3成员变量初始化");

static Book book4 = new Book("static成员book4成员变量初始化");

public static void main(String[] args) {

Person p1 = new Person("p1初始化");

}

/**Output

* static成员book2成员变量初始化

* static成员book4成员变量初始化

* book1成员变量初始化

* book3成员变量初始化

* p1初始化

*///~

}

上面的例子中,Person类中组合了四个Book成员变量,两个是普通成员,两个是static修饰的类成员。我们可以看到,当我们new一个Person对象时,static修饰的成员变量首先被初始化,随后是普通成员,最后调用Person类的构造方法完成初始化。也就是说,在创建对象时,static修饰的成员会首先被初始化,而且我们还可以看到,如果有多个static修饰的成员,那么会按照他们的先后位置进行初始化。

实际上,static修饰的成员的初始化可以更早的进行,请看下面的例子:

class Book{

public Book(String msg) {

System.out.println(msg);

}

}

public class Person {

Book book1 = new Book("book1成员变量初始化");

static Book book2 = new Book("static成员book2成员变量初始化");

public Person(String msg) {

System.out.println(msg);

}

Book book3 = new Book("book3成员变量初始化");

static Book book4 = new Book("static成员book4成员变量初始化");

public static void funStatic() {

System.out.println("static修饰的funStatic方法");

}

public static void main(String[] args) {

Person.funStatic();

System.out.println("****************");

Person p1 = new Person("p1初始化");

}

/**Output

* static成员book2成员变量初始化

* static成员book4成员变量初始化

* static修饰的funStatic方法

* ***************

* book1成员变量初始化

* book3成员变量初始化

* p1初始化

*///~

}

在上面的例子中我们可以发现两个有意思的地方,第一个是当我们没有创建对象,而是通过类去调用类方法时,尽管该方法没有使用到任何的类成员,类成员还是在方法调用之前就初始化了,这说明,当我们第一次去使用一个类时,就会触发该类的成员初始化。第二个是当我们使用了类方法,完成类的成员的初始化后,再new该类的对象时,static修饰的类成员没有再次初始化,这说明,static修饰的类成员,在程序运行过程中,只需要初始化一次即可,不会进行多次的初始化。

回顾了对象的初始化以后,我们再来看static的第三个作用就非常简单了,那就是当我们初始化static修饰的成员时,可以将他们统一放在一个以static开始,用花括号包裹起来的块状语句中:

class Book{

public Book(String msg) {

System.out.println(msg);

}

}

public class Person {

Book book1 = new Book("book1成员变量初始化");

static Book book2;

static {

book2 = new Book("static成员book2成员变量初始化");

book4 = new Book("static成员book4成员变量初始化");

}

public Person(String msg) {

System.out.println(msg);

}

Book book3 = new Book("book3成员变量初始化");

static Book book4;

public static void funStatic() {

System.out.println("static修饰的funStatic方法");

}

public static void main(String[] args) {

Person.funStatic();

System.out.println("****************");

Person p1 = new Person("p1初始化");

}

/**Output

* static成员book2成员变量初始化

* static成员book4成员变量初始化

* static修饰的funStatic方法

* ***************

* book1成员变量初始化

* book3成员变量初始化

* p1初始化

*///~

}

我们将上一个例子稍微做了一下修改,可以看到,结果没有二致。

转自:https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2018-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

【Java学习笔记之十六】浅谈Java中的继承与多态

1、  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。 特点:在继承关...

2497
来自专栏Java面试笔试题

阐述Spring框架中Bean的生命周期?

① Spring IoC容器找到关于Bean的定义并实例化该Bean。 ② Spring IoC容器对Bean进行依赖注入。 ③ 如果Bean实现了Bean...

943
来自专栏Micro_awake web

JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)

通过构造函数生成的实例化对象,无法共享属性或方法(即每个实例化对象上都有构造函数中的属性和方法);造成了一定的资源浪费 1 function Obj(name...

1927
来自专栏积累沉淀

Java枚举类型的原理

package com.lxq.enumm;   public enum Color   {       RED{   public String ...

3998
来自专栏desperate633

Java的HashMap中的常用方法总结遍历HashMap打印HashMap根据HashMap的value进行排序

HashMap在编程中是一个非常有用的工具,使用的频率很高,所以本文简单总结一下hashmap的常用方法

671
来自专栏每日一篇技术文章

Swift3.0 - 初始化和释放

1.系统要求存储属性必须初始化 2.可选值可以不用初始化,如果不初始化值,系统默认用nil初始化它 3.如果非可选类型存储属性不设置默认值,则必须在初始化方...

571
来自专栏LinkedBear的个人空间

唠唠SE的集合-08——TreeSet 原

使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。

632
来自专栏java达人

java匿名内部类简介

匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个...

1797
来自专栏程序员互动联盟

【java基础】static关键字--静态块

在说明static关键字的第三个用法时,我们有必要重新梳理一下一个对象的初始化过程。以下面的代码为例: package com.dotgua.study; cl...

2698
来自专栏数据之美

Sort Map by Value in Java

实际项目或者业务当中,经常会有需求要求对 hashmap 按值排序,并返回指定顺序的 TopN 个元素,今天就来分享下具体的代码及其原理实现。 package ...

1806

扫码关注云+社区