static学习日记(自用)
- static 静态变量 用于修饰成员变量和成员函数
- 当成员那被静态修饰后 就多了一个调用方式 除了可以被对象调用外 还可以直接被类名调用
-
类名.静态成员
-
static特点:
(1)随着类的加载而加载
也就是说静态会随着类的消失而消失,说明他的生命周期最长,当Human类加载到内存中 country在内存中 而name则不在(因为只有创建对象之后 对象里面才有name)
(2)优先于对象的存在
明确:静态是先存在的 对象是后存在的
(3)被所有对象共享
(4)可以直接被类名所调用
class Human{
private String name;//成员变量 实例变量
static String coutry="CN"; //静态的成员变量 类变量
//被static修饰之后 已经不再堆内存中了
/*
* 为什么country可以用static修饰?
* 因为之后创造的每个人都是中国国籍,然而 每创建一个Human h=new Human();以及Human h1=new Human();
* 都会同时创建一个name和country,这样的话占用了内存空间
* 在使用static修饰之后 可以将country理解为被共享了 所有人共享一个country
* 然而每个人姓名都不同 所以不能用一个固定的“名字” 但是country可以
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
talk();
}
public static void talk(){
System.out.println(name+" "+coutry);
}
}
public class StaticDemo {
public static void main(String[] args) {
Human h=new Human();
h.setName("wangwu");
System.out.println("被对象调用 "+h.coutry);
System.out.println("被类名调用 "+Human.coutry);
}
}
实例变量和类变量的区别
实例变量 | 类变量 |
---|---|
实例变量随着对象的建立而存在于堆内存中 | 类变量随着实例的加载而存在于方法区中 |
实例变量的生命周期随着对象的消失而消失 | 类变量生命周期最长,随着类的消失而消失 |
静态使用注意事项
1.静态方法只能访问静态成员
在此例子中,human类在调用静态方法talk类时,静态方法talk要访问对象的name,但是在本例子中还未创建对象,所以name还没有被创建
非静态方法既可以访问静态也可以访问非静态
2.静态方法中不可以定义this、super关键字,因为静态优先于对象存在,所以不可以定义
静态优缺点