java学习之静态块显示初始化块构造函数this在构造函数中的调用,区别联系与调用顺序

Posted dreamy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java学习之静态块显示初始化块构造函数this在构造函数中的调用,区别联系与调用顺序相关的知识,希望对你有一定的参考价值。

1.静态代码块---给类初始化,随着类的加载而执行,只执行一次(注:仅创建类的引用(即只申明)并不会触动对该类的加载)

/**
     * 静态代码块
     * 特点:随着类的加载而执行,只执行一次,用于给类经行初始化
     */
    static{
        System.out.println("a");
    }

 

2.(显示初始化块)构造代码块---给对象初始化,

/**
     * 构造代码块
     * 作用:给对象进行初始化
     * 对象一建立就运行,而且优先于构造函数执行
     * 
     * 和构造函数的区别
     * 构造代码块是给所有对象进行统一初始化,而构造函数给对应的对象初始化(给不同的对象经行分别初始化,如无参构造函数、有参构造函数)
     * 
     * 构造代码块中定义的是不同对象共性的初始化内容
     */
    {
        
    }

 

3.构造函数--给对应对象初始化

4.this

/**
     * this语句,用于构造函数之间进行互相调用,因为this代表对应对象,而构造函数是给对应对象初始化,都是同一个对象
     * this语句,只能定义在构造函数的第一行--规则的解释:因为初始化得先执行,自己设置的值在后面才可以覆盖系统的初始化,不然顺序一反就是系统的默认初始化覆盖自己的设置
     * 
     * @param name
     */
    public Demo(String name) {
        this.name="haha";
    }
    public Demo(String name,int age){
        this(name);
        this.name=name;
        this.age=age;
        System.out.println("A:name="+name+",age="+age);
//        cry();
    }

以下内容总代码:

package com.dreamly.day01;

/**
 * @author dreamly
 *
 */
public class Demo {
    
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    /**
     * 静态代码块
     * 特点:随着类的加载而执行,只执行一次,用于给类经行初始化
     */
    static{
        System.out.println("a");
    }

    /**
     * 构造代码块
     * 作用:给对象进行初始化
     * 对象一建立就运行,而且优先于构造函数执行
     * 
     * 和构造函数的区别
     * 构造代码块是给所有对象进行统一初始化,而构造函数给对应的对象初始化(给不同的对象经行分别初始化,如无参构造函数、有参构造函数)
     * 
     * 构造代码块中定义的是不同对象共性的初始化内容
     */
    {
        //定义不同对象共性的初始化部分可写在此处,比如cry()方法
        cry();
    }
    
    public Demo(){
        this("hah");
        System.out.println("A:name="+name+",age="+age);
//        cry();
    }
    /**
     * this语句,用于构造函数之间进行互相调用,因为this代表对应对象,而构造函数是给对应对象初始化,都是同一个对象
     * this语句,只能定义在构造函数的第一行--规则的解释:因为初始化得先执行,自己设置的值在后面才可以覆盖系统的初始化,不然顺序一反就是系统的默认初始化覆盖自己的设置
     * 
     * @param name
     */
    public Demo(String name) {
        this.name="haha";
    }
    public Demo(String name,int age){
        this(name);
        this.name=name;
        this.age=age;
        System.out.println("A:name="+name+",age="+age);
//        cry();
    }
    
    
    private void cry() {
        System.out.println("cry...");
    }
}
package com.dreamly.day01;

/**
 * @author dreamly
 *
 */
public class DemoTest {
    public static void main(String[] args) {
        Demo d=new Demo();
        d.setName("lily");
        d.setAge(20);
    }
}
package com.dreamly.day01;

/**
 * @author dreamly
 *
 */
public class Demo2 {
    int num=5;
    static {
        System.out.println("b");
    }
    {
        System.out.println("c"+this.num);
    }
    Demo2(){
        System.out.println("a");
    }
    Demo2(int num){
        System.out.println("d");
    }
    
    public static void main(String[] args) {
        Demo2 d2=new Demo2();
        d2.num=4;//执行顺序  b  c5  a
    }
    
    
}
package com.nico.test;

public class Demo1 {
    static int i;    
    static {
//        System.out.println("静态块");
        i = 8;    //2
    }
    
    {
        System.out.println("初始化块");
        i = 10;    //7
    }
    
    public Demo1() {    //如果有显式初始化块,先执行初始化块    4
        this( "i = " + i );        //5 如果要在无参构造调用其它构造函数,那么这条语句只能写在第一行
        System.out.println("无参构造函数");
    }
    
    public Demo1(String str) {    //6
        System.out.println(str);    //8 "i = 8";
    }
    public static void main(String[] args) {
        Demo1 d = new Demo1();    //1    3
    }
}

 

以上是关于java学习之静态块显示初始化块构造函数this在构造函数中的调用,区别联系与调用顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java学习之初始化块

新手小白学JAVA 面向对象2 构造函数 构造代码块 this

Java对象实例化顺序

构造函数,构造代码块和静态代码块的先后顺序和运用

java代码块牛刀小试

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