• 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

  • 相关阅读:
    图像分割学习笔记_1(opencv自带meanshift分割例子)
    基础学习笔记之opencv(10):Mat mask操作
    Qt学习之路_6(Qt局域网聊天软件)
    Qt学习之路_8(Qt中与文件目录相关操作)
    Android开发历程_6(RadioButton和CheckBox的使用)
    Qt学习之路_4(Qt UDP的初步使用)
    目标跟踪学习笔记_4(particle filter初探3)
    Reading papers_11(读Integrating local action elements for action analysis相关文章)
    基础学习笔记之opencv(8):Mat 基本图像容器
    基础学习笔记之opencv(14):随机数发生器&绘制文字
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13724681.html
Copyright © 2020-2023  润新知