zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    wtforms
    day 036 线程 -创建,守护线程
    day 035 管道 和数据共享
    day034 锁,信号量,事件,队列,子进程与子进程通信,生产者消费者模型,joinableQueue
    day33 创建进程的方法和相关操作
    day 32并行 并发
    day 31 socketserver 和ftp打印进度条
    day 029 缓冲区和粘包 day 30 粘包的解决
    相关英语简称
    【实战】初识ListView及提高效率
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13724681.html
Copyright © 2011-2022 走看看