Java面向对象之关键字(二)static
参考价值:已完结、可参考、等待重置
目录:
- 为什么引入了static关键字?
- 怎么使用static关键字?
- static的原理是什么?
- 什么时候使用static?
为什么引入static关键字?
我们都知道,每new一个对象都会把其属性和方法在内存里加载一遍。但是如果某个属性所有的对象都一样,那么每new一个对象都把这个属性加载依次就会产生不小的内存浪费。比如:
1 | class staff{ |
如果我们声明了一个staff类来表示公司的员工,公司200个员工,都是中国人难道我们要在内存里加载200个nation=CHN吗?显然不可能。
为了解决这个问题,static关键字应运而生。
怎么使用static关键字?
static的作用:
static能把修饰的类的成员变成所有对象共用的,只需要在内存中加载一次。
static的修饰范围:
属性、方法、代码块、内部类
static修饰属性:
1
2
3
4
5
6class staff{
//属性:
String name;
int age;
static String nation;
}被static修饰的属性可以被类和所有的对象调用。
static修饰方法:
1
2
3
4
5
6
7
8
9
10class staff{
//属性:
String name;
int age;
static String nation;
//方法:
static void talk(){
System.out.println("我说汉语");
}
}被static修饰的方法可以被类和所有的对象调用。
static修饰的方法只能调用被static修饰的方法、属性或者其它类成员。
static修饰的方法不能使用this关键字和supper关键字
static的原理是什么?
我们知道类声明的时候并加载到堆里面但是会被加载到方法区里面。当类没有用的时候就会被垃圾回收。而建立对象时,对象会被加载到堆里面,当栈里没有指向对象的时候,对象就会被回收。
而被static修饰的类的成员就会和类一起加载在方法区,知道类被垃圾回收,static修饰的成员才会跟着被回收。这也是为什么static修饰的方法不能调用未被static修饰的成员,因为被static修饰的方法被加载的时候,对象还没有创建,内存中根本就没有未被static修饰的成员,调用也就无从谈起。
什么时候使用static?
static的作用就是节省内存空间,因此在程序复杂度不提高的情况下尽量都用static修饰,因此就衍生了以下原则:
- 所有对象都相同的属性用static修饰
- 未直接或间接调用未被static修饰的成员的方法用static修饰
- Utility工具类里的所有方法用static修饰
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 青春玩命的年代!
评论