Java 类、对象内容回顾

来源:互联网 发布:thething知乎 编辑:程序博客网 时间:2024/05/17 22:53

一、类的初始化

类的初始化:主要是执行执行类中的静态块初始化和静态变量初始化
当类被用到的时候就会进行初始化,但是不一定会被实例化实例化的时候才会执行实例域的初始化和初始化代码块的代码

class ThirdInit{    private int age=0;//这种是第一种方式    private String name="initial name";    private static String staticField="initial staticField";    {        System.out.println("初始化之前 "+age+" "+name+" "+staticField);        age=10;        name="static name";        staticField="static staticfield";        System.out.println("初始化之后 "+age+" "+name+" "+staticField);    }    static {        /**         * 静态初始化块:用来初始化静态变量的,静态初始化块中只能接触静态变量         */        System.out.println("静态初始化之前"+staticField);        staticField="static name";        System.out.println("静态初始化之后"+staticField);    }    public ThirdInit(String name,int age,String staticField){        System.out.println("构造器执行之前:"+age+" "+name+" "+staticField);        this.name=name;        this.age=age;        this.staticField=staticField;        System.out.println("构造器执行之后:"+age+" "+name+" "+staticField);    }}

结果:

静态初始化之前initial staticField静态初始化之后static name初始化之前 0 initial name static name初始化之后 10 static name static staticfield构造器执行之前:100 new name new static field构造器执行之后:100 new name new static field

结果说明:

  1. 当实例化一个类的时候顺序:先是静态的,然后是显示的,最后才是构造器本身
  2. 先是静态域和静态块顺序执行,显示的域初始化和块初始化顺序执行、最后是构造器本身
----------class ThirdInit{    private int age=0;//这种是第一种方式    private String name="initial name";    private static String staticField="initial staticField";    {        System.out.println("初始化之前 "+age+" "+name+" "+staticField);        age=10;        name="static name";        staticField="static staticfield";        System.out.println("初始化之后 "+age+" "+name+" "+staticField);    }    static {        /**         * 静态初始化块:用来初始化静态变量的,静态初始化块中只能接触静态变量         */        System.out.println("静态初始化之前"+staticField);        staticField="static name";        System.out.println("静态初始化之后"+staticField);    }    public ThirdInit(String name,int age,String staticField){        System.out.println("构造器执行之前:"+age+" "+name+" "+staticField);        this.name=name;        this.age=age;        this.staticField=staticField;        System.out.println("构造器执行之后:"+age+" "+name+" "+staticField);    }    public static void main(String[] args) {        System.out.println("main 方法开始执行");    }}

输出:

静态初始化之前initial staticField静态初始化之后static namemain 方法开始执行

这里说明:构造代码块和显示域是属于一个类的实例的,如果没有调用一个类的构造函数,那么这些都不会执行。

所有的动作都是从父类到子类执行的

二、对象的初始化

public class Test{    private static String staticField=init("Test类静态域初始化");    public String obField=init("Test实例域初始化");    static{        System.out.println("Test 静态块");    }    {        System.out.println("Test 实例域块");    }    public static void main(String[] args) {        System.out.println("\n main 函数开始执行,实例化Test类和Apple类---------------------------\n");        new Test();        new Apple();    }    public static String init(String field){        System.out.println(field);        return "static Field";    }}class Fruit{    static{        System.out.println("父类static block");    }    {        System.out.println("父类 block");    }    public Fruit() {        System.out.println("父类构造函数");    }}class Apple extends Fruit{    static{        System.out.println("子类 static block");    }    {        System.out.println("子类 block");    }    public Apple() {        System.out.println("子类 构造函数");    }}

输出结果:

Test类静态域初始化Test 静态块 main 函数开始执行,实例化Test类和Apple类---------------------------Test实例域初始化Test 实例域块父类static block子类 static block父类 block父类构造函数子类 block子类 构造函数

这说明,用到某个类的时候它才会被加载进来并进行类初始化执行static变量和static块,此时先执行父类的在执行子类的),当实例化的时候才会进行对象初始化实例域初始化和代码块初始化,先父类再子类

0 0
原创粉丝点击