More
More
文章目录
  1. Demo1
  2. Demo2
  3. Demo3
  4. 说点什么
  5. 还有什么玩法

你有freestatic吗?

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

clipboard.png

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

打赏
手机扫一扫,支持CHE~