代码块介绍:
-
代码块的作用:用来初始化类、对象
-
代码块如果有修饰的话,只能使用static
-
分类:静态代码块VS非静态代码块
-
静态代码块
- 内部可以有输出语句
- 随着类的加载而执行(类只加载一次,静态代码块只执行一次)
- 作用:初始化类的信息
- 如果一个类中有多个静态代码块,则按照上下顺序执行
- 静态代码块只能调用静态的结构,不能调用非静态的结构
-
非静态代码块
- 内部可以有输出语句
- 随着对象的创建而执行(每造一个对象就执行一次)
- 作用:可以在创建对象时,对对象的属性等进行初始化
- 如果一个类中定义了多个非静态代码块,则按照上下顺序执行
- 非静态代码块可以调用静态的结构也能调用非静态的结构
对属性可以赋值的位置:从上到下为先后顺序
-
默认初始化
-
显示初始化/代码块中对属性进行初始化
-
构造器中初始化
-
对象.属性/对象.方法 对属性进行初始化
关于子父类,代码块和构造器的执行顺序:
package com.myobjectoriented3.nonworking;
class Root{
static {
System.out.println("1 Root的静态初始化块");
}
{
System.out.println("4 Root的动态代码块");
}
public Root() {
super();
System.out.println("5 Root的无参构造器");
}
}
class Mid extends Root{
static {
System.out.println("2 Mid的静态初始化块");
}
public Mid(String msg) {
this();
System.out.println("8 Mid的带形参构造器,形参:"+msg);
}
{
System.out.println("6 Mid的动态代码块");
}
public Mid() {
super();
System.out.println("7 Mid的无参构造器");
}
}
class Leaf extends Mid{
static {
System.out.println("3 Leaf的静态初始化代码块");
}
public Leaf() {
super("hello,block");
System.out.println("10 Leaf的构造器");
}
{
System.out.println("9 Leaf的动态代码块");
}
}
public class BlockTest {
public static void main(String[] args) {
new Leaf();
}
}
由父及子,静态先行
当程序运行时:
-
先加载静态结构,静态加载完毕以后,在执行按顺序执行main方法里面的内容,碰到造对象了,再加载动态的结构和构造器;
-
加载的顺序是这样的:先加载最上层的父类的代码块和构造器,然后再加载次父类的代码块和构造器;父类全部加载完毕以后再加载子类的代码块和构造器;
package com.myobjectoriented3.nonworking;
class Father{
static {
System.out.println("1111111111111");
}
{
System.out.println("222222222");
}
public Father() {
System.out.println("8888888888888");
}
}
public class SonTest extends Father{
static {
System.out.println("77777777");
}
{
System.out.println("666666666666666");
}
public SonTest(){
System.out.println("55555");
}
public static void main(String[] args) {
System.out.println("999999999999");
System.out.println("****====****");
new SonTest();
}
}