初始化块的运用

Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中的,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。

适用于大量重复调用的方法可以节省资源不用避免大量重复书写相同的参数和方法

1非静态初始化块:

在这里插入图片描述

非静态初始化块的作用的是给对象进行,他的优先级大于普通的构造函数的运行优先级,他与普通构造函数的区别在于,非静态初始化块他给所有对象进行统一初始化,构造函数只给对应对象初始化。

应用:将所有构造函数共性的东西定义在构造代码块中。

2静态初始化块

在这里插入图片描述

给类进行初始化。随着类的加载而执行,且只执行一次

与构造代码块的区别:

1)构造代码块用于初始化对象,每创建一个对象就会被执行一次;静态代码块用于初始化类,随着类的加载而执行,不管创建几个对象,都只执行一次。

2)静态代码块优先于构造代码块的执行

3)都定义在类中,一个带static关键字,一个不带static

当一个对象被创建之后,虚拟机会为其分配内存,主要用来存放对象的实例变量及其从超类继承过来的实例变量(即使这些从超类继承过来的实例变量有可能被隐藏也会被分配空间)。在为这些实例变量分配内存的同时,这些实例变量也会被赋予默认值。

在这里插入图片描述

上面的代码中,Foo和Bar中都定义了变量i,在main方法中,我们用Foo引用一个Bar对象,如果实例变量与方法一样,允许被覆盖,那么打印的结果应该是1,但是实际的结果确是0。但是如果在Bar的方法中直接使用i,那么用的会是Bar对象自己定义的实例变量i,这就是隐藏,Bar对象中的i把Foo对象中的i给隐藏了,这条规则对于静态变量同样适用。在内存分配完成之后,java的虚拟机就会开始对新创建的对象执行初始化操作,因为java规范要求在一个对象的引用可见之前需要对其进行初始化。在Java中,三种执行对象初始化的结构,分别是实例初始化器、实例变量初始化器以及构造函数。

初始化块执行顺序

父类的静态初始化块

子类的静态初始化块

父类的初始化块

父类的构造函数

子类的初始化块

子类的构造函数

猜你喜欢

转载自blog.csdn.net/weixin_44589117/article/details/89371155