zoukankan      html  css  js  c++  java
  • 【静态延迟加载】self关键字和static关键字的区别

    先来看下代码,从代码中发现问题、解决问题

    //先实现一个手机工厂类
    class Phone{
        
        public static function setBrand(){
            echo "Main Phone";
        }
    
        public static function getBrand(){
            self::setBrand();
        }
    
    }
    //huawei 手机工厂
    class HuaWei extends Phone{
        public static function setBrand(){
            echo "HuaWei Phone";
        }
    }
    //xiaomi 手机工厂
    class XiaoMi extends Phone{
        public static function setBrand(){
            echo "XaioMi Phone";
        }
    }
    
    HuaWei::getBrand(); // Main Phone
    XiaoMi::getBrand(); // Main Phone

    上面是一个很经典很普通的工厂模式代码,我们期望的是输出各自手机的品牌名称,但是结果显示的是父类中的品牌名称。这说明我们调用的 self 关键代表的是代码中它所在的那个类 即 Phone 这个类

    //先实现一个手机工厂类
    class Phone{
        
        public static function setBrand(){
            echo "Main Phone";
        }
    
        public static function getBrand(){
            static::setBrand(); //将 self 改为 static
        }
    
    }
    //huawei 手机工厂
    class HuaWei extends Phone{
        public static function setBrand(){
            echo "HuaWei Phone";
        }
    }
    //xiaomi 手机工厂
    class XiaoMi extends Phone{
        public static function setBrand(){
            echo "XaioMi Phone";
        }
    }
    
    HuaWei::getBrand(); // HuaWei Phone
    XiaoMi::getBrand(); // XiaoMi Phone

    这里我们只是将 self 关键字改为了 static 关键字,当值行代码时 这里的static代表的是当前正在执行的类 例如执行 

    HuaWei::getBrand(); 时 static 代表的是 HuaWei
    XiaoMi::getBrand(); 时 static 代表的是 XiaoMi

      这里总结一下 静态延迟加载的含义:把本来在定义阶段固定下来的表达式或变量,改在执行阶段再决定。



  • 相关阅读:
    jetcache 二级缓存使用
    hutool-crypto 依赖 Aes加密,解密
    springboot下的logback-spring配置文件以及使用方式
    docker 实现多个端口映射
    zookeeper部署启动异常,8080端口被占用。
    docker tomcat 文件传递
    关于注解AOP,基于类和方法的实现
    idea 创建file找不到java文件时....
    idea 将项目代码提交到github中
    java第八天---多态、抽象、接口
  • 原文地址:https://www.cnblogs.com/itsuibi/p/10903998.html
Copyright © 2011-2022 走看看