资讯专栏INFORMATION COLUMN

你有freestatic吗?

cppprimer / 1544人阅读

摘要:小节也有类似的栗子,其结论是静态方法不具有多态性。来自一个有趣的问题静态字段论述的问题大致是说以上两个类中各有几个方法本质其实就是有无时的区别。

Demo1

来自关于java中static一个有意思的小案例:

class Employee {
    private static Employee employee = new Employee();
    public static int count1 = 0;
    public static int count2;

    private Employee(){
        count1++;
        count2++;
    };

    public static Employee getInstance(){
        return  employee;
    }
}

public class TestLoader{
    public static void main(String[] args){
        Employee employee = Employee.getInstance();
        System.out.println("count1-------"+employee.count1);
        System.out.println("count2-------"+employee.count2);
    }
}

运行结果为:
count1-------0
count2-------1

public static int count1 = 2; 

private Employee(){
    System.out.println("init count1-------"+count1);  
    System.out.println("init count2-------"+count2);  
    count1++;
    count2++;
};

我们在构造方法中加入两个输出,输出结果为:
init count1-------0
init count2-------0
count1-------2
count2-------1

你也发现了吧,此时count1尚未初始化赋值。即new Employee()先于count1 = 2执行。
因此解决这个demo混淆的最好方法就是将静态变量定义在方法之前。这样是我们平常编码的一种好习惯吧。

Demo2

来自Java有意思的知识点

public class Parent {
    public static String say() {  
        return "parent static say";  
    }  
  
    public String say2() {  
        return "parent say";  
    }  
}  
  
public class Child extends Parent {  
    public static String say() {  
        return "child static say";  
    }  
  
    public String say2() {  
        return "child say";  
    }  
}  

public class OverrideTest {
    public static void main(String[] args) {  
        Parent p = new Child();  
        System.out.println(p.say());  
        System.out.println(p.say2());
    }
}

运行结果:
parent static say
child say

是你想的那样吗?

所谓静态方法,并不仅仅指该方法在所有实例中只有一份,同时也指该方法是“静态”加载的,即在编译期就已决定其行为。此处p的静态类型为Parent,所以它所调用的方法也在编译期和Parent的say()方法绑定。

《Think In Java》8.2小节也有类似的栗子,其结论是“静态方法不具有多态性”。

Demo3

来自一个有趣的问题(java静态字段)

class TestMethodA {
    static String name = "rebey.cn";
}
class TestMethodB {
    static final String name = "rebey.cn";
}

论述的问题大致是说以上两个类中各有几个方法?本质其实就是有无final时的区别。怎样,心中有答案了吗?

说点什么
   /**
     * 修饰
     * 属性
     * 方法
     * 对象
     */
    
    
    /**
     * 类加载时,实例化前加载一次;;
     * 可通过类名直接调用或实例调用,且所有实例共享;
     * 
     * 此外,静态方法中不能用this和super关键字,
     * 不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法),
     * 只能访问所属类的静态成员变量和成员方法;
     * 
     */
还有什么玩法

静态导包;

本文不定期更新中...
更多有意思的内容,欢迎访问rebey.cn

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67443.html

相关文章

  • React 328道最全面试题(持续更新)

    摘要:希望大家在这浮夸的前端圈里,保持冷静,坚持每天花分钟来学习与思考。 今天的React题没有太多的故事…… 半个月前出了248个Vue的知识点,受到很多朋友的关注,都强烈要求再出多些React相前的面试题,受到大家的邀请,我又找了20多个React的使用者,他们给出了328道React的面试题,由我整理好发给大家,同时发布在了前端面试每日3+1的React专题,希望对大家有所帮助,同时大...

    kumfo 评论0 收藏0
  • vue 248+个知识点(面试题)为你保驾护航

    摘要:要招一个会的开发者作为面试官的你,你还会每次都只是问这些老土的问题吗你对的理解是什么你知道什么是双向绑定吗你了解它的原理吗说说的生命周期有哪些组件通讯有哪些你用过吗作为面试者的你,在网上搜索下面试题及答案,看完后你是不是觉得自己掌握了武林秘 showImg(https://segmentfault.com/img/bVburrG?w=533&h=300); 要招一个会vue的开发者: ...

    snowell 评论0 收藏0
  • 云主机助手是什么东西-如果你有一台云主机,你会用来做什么呢?

    摘要:如果你有一台云主机,你会用来做什么呢已经有一个个人使用的云主机。这台云主机安装的是系统。通过云主机的公网可以家庭网络的公用映射。云帮手面板是啥可以管理云主机吗云帮手是一款集中化管理云主机的软件。基本上针对云主机,云帮手的功能是十分齐全的了。如果你有一台云主机,你会用来做什么呢?已经有一个个人使用的云主机。这台云主机安装的是centos系统。使用docker装了几个网站。使用nodejs通过m...

    chadLi 评论0 收藏0
  • 5面阿里,终获offer(Java后端)

    摘要:所以,刚开始我并没有直接就投递阿里,毕竟心里还是有一点点小害怕的。操作系统的内存管理机制进程和线程的区别说下你对线程安全的理解有什么作用,和有什么区别实现原理用过么什么场景下用的底层原理。 作者:ppxyn。本文来自读者投稿。该文已加入笔主的开源项目——JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:https://github.com/Sna...

    Alliot 评论0 收藏0
  • Vue中的EventBus使用时你有过这种情况????

    摘要:但是,不要高兴的太早。。。。。,看看页面上并不是显示的我们传过来的值。。。现将两个页面的部分代码做如下修改部分代码部分代码不知道你们了解这个的使用姿势了吗反正作为菜鸟的我是又学到了,欢迎留言说说你们在开发中遇到的一些值得卸载小本本上的问题呗 本文首发在个人的博客上,地址:重庆崽儿Brand,欢迎访问~~~~ 最近做公司项目遇到这样一个需求: 从一个页面跳转到另一个页面去选择一些信息,选...

    yeyan1996 评论0 收藏0

发表评论

0条评论

cppprimer

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<