美文网首页Java学习-小白入门
子类、继承与代码块

子类、继承与代码块

作者: 天马行空爱做梦 | 来源:发表于2019-01-23 11:51 被阅读0次

    代码块

    1.普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块。 如:

    public ClassA() {
    System.out.println("this is class A");
    }

    1. 构造代码块:是在类中直接定义的,用“{}”括起来的代码。每次调用构造方法前执行,都会先执行构造代码块。如:

    public class ClassA {
    public ClassA() {
    System.out.println("this is class A");
    }// 普通代码块
    { System.out.println("Class A"); } // 构造代码块
    }

    1. 静态代码块:他在类中的成员位置,用“{}”括起来的代码。只不过他用了static修饰了,且只执行一次

    public class ClassA {
    public ClassA() {
    System.out.println("this is class A");
    }// 普通代码块
    { System.out.println("Class A"); } // 构造代码块
    static { System.out.println("Class A Static "); } // 静态代码块
    }

    子类、继承与代码块 调用顺序

    父类ClassA

    public class ClassA {
    public ClassA() {
        System.out.println("this is class A");
    }
    {
        System.out.println("Class A");
    }
    }
    

    子类ClassB

    public class ClassB extends ClassA{
    public ClassB() {
        System.out.println("this is class B");
    }
    {
        System.out.println("Class B");
    }
    public static void main(String[] args) {
        new ClassB();
    }
    

    结果

    Class A
    this is class A
    Class B
    this is class B

    总结

    1、构造代码块 先执行, 再依据 先父类再子类的顺序执行
    2、父类 构造代码块,父类构造函数
    3、子类 构造代码块,子类构造函数

    子类、继承与静态代码块 调用顺序

    父类

    public class ClassA {
    public ClassA() {
        System.out.println("this is class A");
    }
    {
        System.out.println("Class A");
    }
    static {
        System.out.println("static ClassA code");
    } // 新增的静态代码块
    }
    

    子类

    public class ClassB extends ClassA{
    public ClassB() {
        System.out.println("this is class B");
    }
    {
        System.out.println("Class B");
    }// 构造代码块
    static {
        System.out.println("static ClassB code");
    }// 静态代码块
    public static void main(String[] args) {
        new ClassB(); // 
    }
    }
    

    输出结果

    static ClassA code
    static ClassB code
    Class A
    this is class A
    Class B
    this is class B

    总结2

    1、static静态代码块 先执行, 再依据 先父类再子类的顺序执行
    2、父类 构造代码块,父类构造函数
    3、子类 构造代码块,子类构造函数

    搞个复杂一点的

    父类

    public class ClassA {
    static {
        System.out.println("第一个 static ClassA ");
    }
    
    {
        System.out.println("第一个Class A构造代码块");
    }
    
    public ClassA() {
        System.out.println("this is class A");
    }
    
    {
        System.out.println("第二个Class A 构造代码块");
    }
    static {
        System.out.println("第二个static ClassA code");
    }
    }
    

    子类

    public class ClassB extends ClassA{
    static {
        System.out.println("第一个 static ClassB ");
    }
    {
        System.out.println("第一个Class B构造代码块");
    }
    public ClassB() {
        System.out.println("this is class B");
    }
    {
        System.out.println("第二个Class B 构造代码块");
    }
     static {
        System.out.println("第二个static ClassB code");
    }
    public static void main(String[] args) {
        {
            System.out.println(" main的构造代码块");
        }
        new ClassB();
    }
    }
    

    输出结果:

    第一个 static ClassA
    第二个static ClassA code
    第一个 static ClassB
    第二个static ClassB code
    main的构造代码块
    第一个Class A构造代码块
    第二个Class A 构造代码块
    this is class A
    第一个Class B构造代码块
    第二个Class B 构造代码块
    this is class B

    改动下 main函数

    public static void main(String[] args) {
        {
            System.out.println(" main的构造代码块");
        }
        new ClassB();
        System.out.println("------ 分界线-------");
        new ClassA();
        new ClassB();
    }
    

    输出结果:

    第一个 static ClassA
    第二个static ClassA code
    第一个 static ClassB
    第二个static ClassB code
    main的构造代码块
    第一个Class A构造代码块
    第二个Class A 构造代码块
    this is class A
    第一个Class B构造代码块
    第二个Class B 构造代码块
    this is class B
    ------ 分界线-------
    第一个Class A构造代码块
    第二个Class A 构造代码块
    this is class A
    第一个Class A构造代码块
    第二个Class A 构造代码块
    this is class A
    第一个Class B构造代码块
    第二个Class B 构造代码块
    this is class B

    总结3

    他会执行父类classA类下的静态块,再子类ClassB,在执行main方法,然后执行代码,静态的只执行一次,构造方法块每次都执行

    进一步看static 静态代码块

    //在上面基础上只修改main函数,无new 类

    public static void main(String[] args) {
    
        System.out.println("------ 空执行main函数-------");
    
    }
    

    输出结果:

    第一个 static ClassA
    第二个static ClassA code
    第一个 static ClassB
    第二个static ClassB code
    ------ 空执行main函数-------

    总结4

    static 代码在类加载的时候,就执行了。

    相关文章

      网友评论

        本文标题:子类、继承与代码块

        本文链接:https://www.haomeiwen.com/subject/pbhjjqtx.html