• 值得深入分析的代码块


    单纯地去读这些代码容易迷糊,但对于了解(复习)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
  • 相关阅读:
    [Javascript] Broadcaster + Operator + Listener pattern -- 3 Stop with condition
    分布式事务科普(初识篇)
    分布式事务不理解?一次给你讲清楚!
    分布式事务,有解吗?
    分布式事务精华总结篇,实打实的干货!
    常用的分布式事务解决方案介绍有多少种?
    5种分布式事务解决方案优缺点对比
    Leaf——美团点评分布式ID生成系统
    MySQL分区总结
    互联网公司为啥基本不使用mysql分区表
  • 原文地址:https://www.cnblogs.com/ss0xt/p/8569780.html
Copyright © 2020-2023  润新知