static关键字
- 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。
- 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员,
- 静态方法不再是针对某个对象调用,所以不能访问非静态成员。
- 可以通过对象引用或类名(不需要实例化)访问静态成员。
- 静态变量存放在内存中的数据区(data seg)中,
public class Cat {
private static int sid = 0;
private String name;
int id;
Cat(String name){
this.name = name;
id = sid++;
}
public void info(){
System.out.println("My name is " + name + "No." + id);
}
public static void main(String[] args) {
Cat.sid = 100;
Cat mimi = new Cat("mimi");
Cat pipi = new Cat("pipi");
mimi.info();
pipi.info();
}
}
执行Cat.sid = 100;
时,在data seg中分配一个空间给sid并赋值为100,然后执行Cat mimi = new Cat("mimi");
,先在栈内存中为mimi分配一个空间,new出来的cat对象在堆内存中,其有两个成员变量name和id,传的参数是字符串类型的”mimi“,”mimi“是一个String类型的对象,存放在内存中的data seg中,name应指向这块内存,然后准备调用cat的构造方法,构造方法有一个形参name,先在栈内存中为其分配一个空间,开始执行构造方法,this.name = name;
,将data seg中的name(”mimi“)赋给mimi这个对象中的name,所以mimi这个对象中的name应指向data seg中的name,所以mimi对象中的name变量的值应该为“mimi”,然后执行id = sid++;
,sid的初始值为100,先将100赋给id然后加1变成101存在data seg中,所以mimi对象id为100。
Cat pipi = new Cat("pipi");
执行时同上。