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
  • 相关阅读:
    我的有道难题算法-双倍超立方数
    终于获取了SharePoint.OpenDocument对象打开的Word对象
    Eclipse下的项目管理插件介绍
    初识 sqlite 与 content provider 学习笔记
    android 官方文档中的一些错误收集
    android TraceView (图形化性能测试工具)使用入门笔记
    Texttospeech 入门与进阶学习笔记(android)
    Intent进阶 和 Intentfilter 学习笔记
    android UI设计属性中英对照表(未修订)
    android学习笔记7天打造一个简易网络Mp3播放器
  • 原文地址:https://www.cnblogs.com/ss0xt/p/8569780.html
Copyright © 2011-2022 走看看