【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 条评论
登录 后参与评论

相关文章

来自专栏Play & Scala 技术分享

理解Scala的Symbol类型

3513
来自专栏java架构师

IEnumerable和IEnumerator的关系

using System; using System.Collections; public class Person { public Person...

27410
来自专栏菩提树下的杨过

scala 学习笔记(07) 一等公民的函数

在scala中一切皆对象,一切皆函数,函数跟Int,String、Class等其它类型是处于同等的地位,换句话说,使用函数跟使用普通的类型一样,没什么区别,因此...

1937
来自专栏极乐技术社区

使用ES6新特性开发微信小程序(5)——内建对象的变化

Object对象 Object.prototype.proto:对象具有属性proto,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保...

2428
来自专栏开发与安全

从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类与空数组

一、深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): ? 如果只...

1K0
来自专栏Create Sun

基础拾遗------委托详解

前言:   C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(D...

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

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

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

2768
来自专栏Java帮帮-微信公众号-技术文章全总结

java 自动装箱与拆箱

这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编...

3376
来自专栏较真的前端

关于数据类型的前端面试题总结,不要被鄙视哦~

2316
来自专栏柠檬先生

你不知道的javaScript笔记(5)

原生函数   常用的原生函数     String()     Number()     Boolean()     Array()     Object() ...

19110

扫码关注云+社区