static的存在是因为,当多个对象的某个成员都相同时,堆内存中会比较占空间;使用static,将此被“共享”的成员拿出来,单独存放在方法区。
class Dog {
static String name="guana";//定义静态变量name
int age;
}
class DogDemo{
public static void main(String[] args){
System.out.println(Dog.name);//静态变量可直接被类名调用(此时无对象产生)
}
}
/*
代码运行结果:
guana
*/
static特点:
1)随类的加载而加载(随类的消失而消失,说明其生命周期最长);此特点会限制其使用(见下方注意)
2)优先于对象存在
3)被所有对象共享
4)可直接被类名调用
注意:
1)静态方法只能访问静态成员
非静态方法即可访问静态,也可访问静态;// ∵静态方法在类创建时就出现,而非静态成员随对象创建而出现。类先于对象存在,∴静态方法无法访问“当时”还未存在的非静态成员。
2)静态方法中不可以定义this、super等关键字。 //同理,this指代对象,静态方法出现时,对象还未出现。
class Dog {
String name="guana";
int age;
static void speak(){
System.out.println(name);
}
}
class DogDemo{
public static void main(String[] args){
Dog D1=new Dog();
D1.speak();
}
}
/*
代码报错:
Error:(5, 28) java: 无法从静态上下文中引用非静态 变量 name
*/
//即 静态方法 speak()不能调用非静态成员name