• java的静态代码块和类变量的隐式覆盖


    静态代码块特点:随着类的加载执行一次,且仅会执行一次

    作用:初始化类中的static修饰的变量(static修饰的变量称为类变量。类变量和静态代码块差不多,类变量仅会被初始化一次)

    一、静态代码块写法:

    static{
    
    }

    非静态代码块写法:

    {
    
    }

    执行顺序:静态代码块->代码块->构造函数

    二、那么我们来看一下,如果子类son继承父类people,那么这些代码块执行顺序

    public class smile {
    
        public static class people{
            static {
                System.out.println("父类静态代码块");
            }
            {
                System.out.println("父类代码块");
            }
            public people() {
                System.out.println("父类构造函数");
            }
        }
        public static class son extends people{
            static {
                System.out.println("子类静态代码块");
            }
            {
                System.out.println("子类代码块");
            }
            public son() {
                System.out.println("子类构造函数");
            }
        }
        public static void main(String[] args) {
            son a = new son();
        }
    
    }

    结果:

    父类静态代码块
    子类静态代码块
    父类代码块
    父类构造函数
    子类代码块
    子类构造函数

    三、如果你不相信静态代码块只会执行一次你可以实例化两个son类

    public class smile {
    
        public static class people{
            static {
                System.out.println("父类静态代码块");
            }
            {
                System.out.println("父类代码块");
            }
            public people() {
                System.out.println("父类构造函数");
            }
        }
        public static class son extends people{
            static {
                System.out.println("子类静态代码块");
            }
            {
                System.out.println("子类代码块");
            }
            public son() {
                System.out.println("子类构造函数");
            }
        }
        public static void main(String[] args) {
            son a = new son();
            son b = new son();
        }
    
    }
    /*
     * 父类静态代码块
    子类静态代码块
    父类代码块
    父类构造函数
    子类代码块
    子类构造函数
    父类代码块
    父类构造函数
    子类代码块
    子类构造函数
     * */

    四、类中变量的隐式覆盖:

    public class smile {
    
        public static class people{
            double money;
            public people(){
                money=10.5;
            }
            public double get_money() {
                return money;
            }
        }
        public static class human extends people{
            int money;
            public human(){
                money=5;
            }
        }
        public static void main(String[] args) {
            human a = new human();
            System.out.println("现在余额为:"+a.money);
            System.out.println("现在余额为:"+a.get_money());
        }
    
    }

    你会发现直接通过实例对象a.money访问不到父类的money

  • 相关阅读:
    HDU4112
    HDU1059 二进制拆分优化多重背包
    HDU1087
    HDU1978How Many Ways 记忆化dfs+dp
    HDU1160FatMouse's Speed
    HDU1503Advanced Fruits
    CF337C
    337BRoutine Problem
    【★★★★★模板专区★★★★★】
    【水】Jam计数法
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13724681.html
Copyright © 2020-2023  润新知