Java类 初始化块

java里初始化一个类的对象,通过初始化快或者构造方法进行数据赋值。与其相关的执行代码有这么几种:

  • 静态初始化块
  • 初始化块
  • 构造方法

静态初始化块

静态初始化块只在类加载时执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。


非静态初始化块

非静态初始化块在每次初始化实例对象的时候都执行一次,可以给任意变量赋值。


构造方法

在每次初始化实例对象时调用。


重点:执行顺序->

  1. 在加载类时执行一次静态初始化块(之后不再调用)。
  2. 在每次初始化实例对象时:先执行非静态初始化块,再执行构造方法。

若是概念不好懂,请看如下实例:

public class InitializationClass {    String name; // 声明变量name    String sex; // 声明变量sex    static int age;// 声明静态变量age

// 构造方法    public InitializationClass() {        System.out.println("通过构造方法初始化name");        name = "tom";    }

// 构造方法    public InitializationClass(String name) {        System.out.println("通过参数构造方法初始化name");        this.name = name;    }

// 构造方法    public InitializationClass(int age) {        System.out.println("通过构造方法改变static InitializationClass.age");        InitializationClass.age = age;    }

// 构造方法    public InitializationClass(String name, String sex) {        System.out.println("通过构造方法初始化name age");        this.name = name;        this.sex = sex;    }

// 初始化块    {        System.out.println("通过初始化块初始化sex");        sex = "男";    }

// 静态初始化块    static {        System.out.println("通过静态初始化块初始化age");        age = 20;    }

public void show() {        System.out.println("姓名:" + name + ",性别:" + sex + ",年龄:" + age);        System.out.println("------------------------------");    }

public static void main(String[] args) {

// 创建对象        InitializationClass obj1 = new InitializationClass("qiuhua");        obj1.show();

InitializationClass obj2 = new InitializationClass(10);        obj2.show();

InitializationClass obj3 = new InitializationClass("jing", "女");        obj3.show();    }}

  

通过静态初始化块初始化age
通过初始化块初始化sex
通过参数构造方法初始化name
姓名:qiuhua,性别:男,年龄:20
------------------------------
通过初始化块初始化sex
通过构造方法改变static InitializationClass.age
姓名:null,性别:男,年龄:10
------------------------------
通过初始化块初始化sex
通过构造方法初始化name age
姓名:jing,性别:女,年龄:10
------------------------------

转:https://www.cnblogs.com/Berryxiong/p/6245100.html

原文地址:https://www.cnblogs.com/seamanone/p/9568813.html

时间: 2024-08-06 23:18:48

Java类 初始化块的相关文章

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

《初始化块:普通初始化块、静态初始化块(类初始化块)》

1 /* 2 初始化块:普通初始化块.静态初始化块(类初始化块) 3 4 下面程序创建了三个类:Root,Mid和Leaf, 5 者三个类都提供了静态初始化块和普通初始化块, 6 而且Mid类里还是用this调用重载构造区,而 7 Leaf使用super显示调用父类指定的构造器 8 */ 9 class Root 10 { 11 static{ 12 System.out.println("Root的静态初始化块"); 13 } 14 15 { 16 System.out.printl

java类初始化顺序

java类初始化顺序 执行顺序如下: 没有继承其他类时: 静态变量 静态初始化块 变量 初始化块 构造器 继承其他类时: 父类--静态变量 父类--静态初始化块 子类--静态变量 子类--静态初始化块 父类--变量 父类--初始化块 父类--构造器 子类--变量 子类--初始化块 子类--构造器 执行顺序图:

Java的初始化块

Java的初始化块分为静态初始化块和非静态初始化块 静态初始化块 static{ //初始化内容 } 非静态初始化块 { //初始化内容 } 静态初始化块仅能初始化类变量,即static修饰的数据成员.非静态初始化块在对象每次生成时都会被执行一次,可以初始化类的实例变量.两种初始化块不可以传参数. 非静态初始化块在构造函数执行时且构造函数主体代码没执行前执行 静态初始化块.非静态初始化块.构造函数 执行的顺序为:静态初始化块->非静态初始化块->构造函数 非静态初始化块在匿名内部类中使用较多,

Java中初始化块的真实作用

声明:本博客为原创博客,未经允许,不得转载!原文链接为 http://blog.csdn.net/bettarwang/article/details/27128323. 对于普通的类而言,可以放在初始化块中的初始化工作其实完全可以放到构造函数中进行,只不过有时会带来些许不便,如有多个构造器,就要在多个地方加上初始化函数完成初始化工作,而如果放到初始化块中的话则只要写一次即可.如下例所示: import java.util.*; public class Car { private void i

Java的初始化块及执行过程详解

问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块,它可以对Java对象进行初始化操作.下面主要阐述Java的初始化块及执行过程. Java初始化块其实是Java类的成员之一,其语法格式如下: [修饰符]{ //初始化块的可执行代码 ... } 初始化块的修饰符只能是static,使用static修饰符的初始化块称为静态初始化块,后面会介绍到. 下面

java类初始化

class SuperClass{ static{ System.out.println("super class init!"); } static int superInt = 1; static String superString = "supString"; } class SubClass extends SuperClass{ static{ System.out.println("sub class init!"); } stat

从Java类初始化,来看代码优化

Java类初始化顺序可能引起的bug 最近编程中遇到的问题, 类的成员初始化过程大家都很了解,都是基础知识,但是有些地方很微妙,重新学习 下,来提高代码质量. 先描述下遇到的场景: 子类构造器中调用super(),然后在父类构造器中调用子类有@overwrite的方法,子类在overwrite的方法中对自己成 员赋值,log输出成功赋值,在子类new完,log打印发现部分成员变量值丢失了. 打印log发现list数据丢失了,int值还在,如下: 看了半天感觉还是很奇怪,有点不相信代码的感觉,最后