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

原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13724681.html