你有freestatic吗?
字数统计:
635字
|
阅读时长:
2分钟
2017.07.22
Chen hongen
后端
Demo1
来自关于java中static一个有意思的小案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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
1 2 3 4 5 6 7 8
| 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有意思的知识点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 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静态字段)
1 2 3 4 5 6
| class TestMethodA { static String name = "rebey.cn"; } class TestMethodB { static final String name = "rebey.cn"; }
|
论述的问题大致是说以上两个类中各有几个方法?本质其实就是有无final时的区别。怎样,心中有答案了吗?
说点什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| * 修饰 * 属性 * 方法 * 对象 */ * 类加载时,实例化前加载一次;; * 可通过类名直接调用或实例调用,且所有实例共享; * * 此外,静态方法中不能用this和super关键字, * 不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法), * 只能访问所属类的静态成员变量和成员方法; * */
|
还有什么玩法
静态导包;
本文不定期更新中…
更多有意思的内容,欢迎访问rebey.cn