静态代码块,非静态代码库,构造函数,子父继承代码执行顺序

来源:互联网 发布:淘宝0月租流量卡真的吗 编辑:程序博客网 时间:2024/06/04 00:02

静态代码块与静态方法的区别?

  • 什么情况下使用
    • 静态代码块:在项目启动的时候就需要执行的代码,这些代码是主动执行的;
    • 静态方法:在项目启动的时候就初始化,在不创建对象的情况下,能够直接使用的,这种代码是被动的。静态方法在类加载的时候就已经初始化,可以用类名直接调用;
  • 使用静态方法的注意几点
    • 静态方法只能调用同类中静态成员,不能访问非静态成员
    • 静态方法不能以任何方式引用this和super关键字,加载静态方法时,this所用的对象根本没有创建。
    • 静态变量是所以不能定义在方法体内,因为静态变量是针对整个类的

静态代码块,构造方法的初始化顺序

package com.cjm.mvnbook.test1;public class FatherTest {    public String name;    public static String staticName = "22";    FatherTest(){        System.out.println("--父类的无参构造函数--静态变量为:" + this.staticName + "--非静态变量为:" + this.name);    }    FatherTest(String name){        this.name=name;        System.out.println("--父类的有参构造函数--"+this.name);    }    static{        System.out.println("--父类的静态代码块--静态变量为=" + staticName );    }    {        System.out.println("--父类的非静态代码块--静态变量为=" + staticName + "--非静态变量为=" + this.name );    }    public void speak(){        System.out.println("--父类的方法--");    }}
package com.cjm.mvnbook.test1;public class SonTest extends FatherTest {    private String name;    private static String staticName = "33";    @Override    public void speak(){       System.out.println("--子类Override了父类的方法--" + super.staticName);    }    public SonTest(){        System.out.println("----子类无参的构造方法------");    }    public SonTest(String name){        System.out.println("----子类有参的构造方法 "+this.name+ "------");        this.name = name;    }    {        System.out.println("---子类的非静态代码块---");    }    static {        System.out.println("---子类的静态代码块---");    }}

执行结果

实例化父类对象
实例化子类对象

结论

  • 单个类中类先执行静态变量和静态代码块,然后非静态代码快,再就是构造方法,最后就是具体的方法
  • 当有继承关系时,子类在构造对象时,先执行父类的静态代码块->然后再执行子类的静态代码库。因为静态代码块是在类加载的时候就已经在执行,然后执行父类的非静态代码库,父类的无参构造方法,子类的非静态代码块,子类的构造方法
  • 注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
0 0
原创粉丝点击