值得深入分析的代码块

单纯地去读这些代码容易迷糊,但对于了解(复习)java程序的相关知识点很有作用

子类父类资源初始化顺序

不看结果,试着想下输出的结果是什么

Super.java

/**
 * Created by Huangxiutao on 2017/7/25.
 */
public class Super {
    //静态变量
    static int i=10;
    //静态代码块
    static {
        System.out.println("父类静态代码块执行》》》父类静态变量的值:"+i);
    }
    //构造函数
    public Super(){
        System.out.println("父类构造函数执行》》》");
    }
    //普通函数
    public void f(){
        try {
            System.out.println("父类函数f执行》》》");
        } finally {
            System.out.println("父类普通函数f的finally块执行》》》");
        }
    }
    //普通代码块
    {
        System.out.println("父类普通代码块执行》》》父类静态变量的值:"+i);
    }

}

Sub.java

/**
 * Created by Huangxiutao on 2017/7/25.
 */
public class Sub extends Super {
    static int j=5;
    //子类静态代码块
    static {
        System.out.println("子类静态代码块执行》》》子类静态变量的值:"+j);
    }
    //子类构造函数
    public Sub(){
        System.out.println("子类构造函数执行》》》");
    }
    //子类普通的方法
    public void foo(){
        System.out.println("子类普通函数执行》》》");
    }
    //继承的方法
    @Override
    public void f() {
        try {
            System.out.println("子类继承父类的方法执行》》》");
        } finally {
            System.out.println("子类普通函数f的finally块执行》》》");
        }
    }
    //普通代码块
    {
        System.out.println("子类普通代码块执行》》》子类静态变量的值:"+i);
    }


    public static void main(String[] args){
        Super s=new Sub();
        s.f();
    }
}

执行结果:

父类静态代码块执行》》》父类静态变量的值:10
子类静态代码块执行》》》子类静态变量的值:5
父类普通代码块执行》》》父类静态变量的值:10
父类构造函数执行》》》
子类普通代码块执行》》》子类静态变量的值:10
子类构造函数执行》》》
子类继承父类的方法执行》》》
子类普通函数f的finally块执行》》》

顺序:父类静态代码块》子类静态代码块》父类普通代码块》父类构造函数》子类普通代码块》子类构造函数
多态:父类引用指向子类对象(本例中s是Super引用,但是指向的是Sub,因此Sub中如果覆盖了Super中大方法,那s调用的将是Sub中覆盖的方法)

结合try-catch-finnally

public class Test {
    public static void main(String[] args){
        System.out.println(new B().getValue());
    }

    static class A{
        protected int value;
        public A(int value){
            setValue(value);
        }
        public void setValue(int value){
            this.value=value;
        }

        public int getValue(){
            try {
                value++;
                return value;
            } finally {
                this.setValue(value);
                System.out.println(value);
            }
        }
    }

    static class B extends A{
        public B(){
            super(5);
            setValue(getValue()-3);
        }
        public void setValue(int value){
            super.setValue(2*value);
        }
    }
}

输出结果:

22
34
17

上图:关于try-catch-finally执行顺序参见另一篇博客
程序执行顺序

http://huangxiutao.cn
原文地址:https://www.cnblogs.com/ss0xt/p/8569780.html