update on 20200504:修改相关格式;补充相关内容
0 总结
Get to the points first. The article comes from LawsonAbs!
- static关键字可以使多个对象共享一份数据资源。【java没有全局变量】
- static修饰的函数或属性,可以根据 “类名点” 的方式去调用。【class.count】
- 它修饰的成员,在类加载的时候加载并完成初始化,只执行一次。【修饰变量只占一份内存空间】
- 无法从静态的上下文中引用非静态属性或者方法。this也不可以用在static修饰的上下文中。
- 在jvm读取class文件时,就对static的属性和函数进行处理。
- static变量脱离对象存在,而是属于类,所以也称为类变量。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了
- 由static修饰的变量,方法,代码块分别称为静态变量,静态方法,静态代码块
1.Java中的static关键字
《Java编程实现》Chapter 11,持有对象
在本章的第二个代码中【如下】,
package holding;
import java.util.ArrayList;
class Apples {
private static int number;// 表示苹果数量
private final long id = number++;
public long id(){
return id;
}
}
public class CopyOfApplesAndOrangesWithoutGenerics {
public static void main(String [] args){
ArrayList<Apples> apples = new ArrayList<Apples>();
for (int i = 0; i<4; i++)
apples.add(new Apples());
for(int i=0;i<apples.size();i++){
System.out.println((apples.get(i)).id());
}
for(Apples a:apples){
System.out.println(a.id());
}
}
}
我们可以看到程序的执行效果图【如下】:
如果将代码public static int number;修改为public int number;得到的程序执行结果如下:
这个时候我们看到输出全部成0,这是为什么呢?
【知识点1】在程序中,被static 修饰的成员变量只有一份,占一个固定空间,所以虽然在后面申请了三个Apples对象,但是仍然只有一个number ,所以对其做number++赋值给id,然后便可以输出0-3。
【知识点2】通过使用泛型,就可以在编译期防止将错误类型的对象放到容器中。比如此例中的ArrayList<Apples> apples = new ArrayList<Apples>();