你有freestatic吗?

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

clipboard.png

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


JAVA WEB
java web开发之路

希望加入有意思的开发团队!

190 声望
34 粉丝
0 条评论
推荐阅读
jodconvert的亚子
F项目需要滚动播放视频、文档(Excel/Word...)功能,使用jodconverter将文档转成pdf,结合pdfjs实现。由于个人独立开发,只要结果,故选型自由。后端Spring boot,前端阿里飞冰。可以直接使用jodconverter的starter:

花田土著1阅读 4.3k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 27.4k评论 1

一文彻底搞懂加密、数字签名和数字证书!
微信搜索🔍「编程指北」,关注这个写干货的程序员,回复「资源」,即可获取后台开发学习路线和书籍来源:个人CS学习网站:[链接]前言这本是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视...

编程指北71阅读 33.5k评论 20

Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 19.3k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 21.7k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 15.3k

Java13的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft17阅读 11.2k

希望加入有意思的开发团队!

190 声望
34 粉丝
宣传栏