zoukankan      html  css  js  c++  java
  • 值得深入分析的代码块

    单纯地去读这些代码容易迷糊,但对于了解(复习)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
  • 相关阅读:
    2021.5.10-(叶子相似的树)
    2021.5.8-N皇后(回溯)
    2021.5.6-(雪糕最大数)
    2021.4.23刷题(回溯-全排列)
    可持久化动态图上树状数组维护01背包
    Infinite String Comparision
    第6章 操作系统 存储器管理(二)
    markdown
    操作系统 第6章 存储管理(一)
    操作系统 第五章 死锁 (二)
  • 原文地址:https://www.cnblogs.com/ss0xt/p/8569780.html
Copyright © 2011-2022 走看看