Java中static关键字的使用
static关键字的作用
为什么需要static关键字
当我们编写了一个类之后,其实只是描述完了它的属性和行为,但是并没有产生实质的对象,只有当我们new了一个对象之后,内存空间中才会分配空间给对象,它的属性和方法才可以调用。
而有时候,我们会遇到有些数据,无论我们在内存中是否new了对象或new了几个对象,它在数据空间中有且只有一份。
代码举例(为了尽量简洁,代码省略了构造器、权限修饰符、this关键字等)
假设我们有一个Chinese类,它的属性和方法如下:
public class Chinese{
String name; //名字
int age;// 年龄
String nation;//国籍
}
现在一个非常简单的类就构造好了,我们new两个对象试试
public static void main(String[] args) {
//new一个p1的对象
Chinese p1 = new Chinese();
p1.name = "xiaoming;";//名字叫小明
p1.age=18;//小明18岁
p1.nation = "China";//小明是中国人
//p2同理
Chinese p2 = new Chinese();
p2.name="xiaohong";
p2.age=20;
p2.nation = "China";
//输出信息
System.out.println(p1.nation);
System.out.println(p2.nation);
}
我们会发现,在Chinese这个类中,无论你是一个什么样的人,无论你的年龄,职业,性别,名字,都会有一个相同的属性,那就是都是中国人,即nation =“China”.
但在new对象的时候,我们new了多个对象,就会在内存空间中划分多个对象空间,他们里面都会有各自的属性,也就意味着会有两个nation=“China”的属性,这就有点多余了。
所以我们需要在这个类中创建一个静态的变量,让Chinese类的所有对象都共享这个变量,这就需要我们的static关键字了
static的使用
静态变量
如上所述,我们改变Chinese类中nation属性的定义方式,在前面加上static关键字
public class Chinese {
String name;
int age;
static String nation;
}
接着再new对象试试看,但这次不给p2的nation赋值
public static void main(String[] args) {
//new一个p1的对象
Chinese p1 = new Chinese();
p1.name = "xiaoming;";//名字叫小明
p1.age=18;//小明18岁
p1.nation = "China";//小明是中国人
//p2同理,但我们不用再给p2的nation属性赋值
Chinese p2 = new Chinese();
p2.name="xiaohong";
p2.age=20;
//直接输出p2的nation属性的值看看
System.out.println(p2.nation);//输出"China"
}
可以看到,我们只给p1的nation属性赋值,p2也是同样的值,理所当然的,改变p2的nation值,通过p1调用,也是一样的结果。
p2.nation="CN";
System.out.println(p1.nation);//输出"CN"
因为nation通过static的关键字,已经成为了Chinese类的静态方法,这个类的所有对象都指向它,而且我们可以不创建对象,直接通过类来调用它,但我们得先给他赋个默认值。
public class Chinese(){
static String nation = "CHN";
}
直接通过Chinese调用。
public static void main(String[] args) {
System.out.println(Chinese.nation); //输出“CHN”
}
静态方法
有了静态属性,肯定也可以有静态方法,同样的我们在Chinese中创建一个show()方法,来输出我们的国籍
public void show(){
System.out.println("国籍为" + nation);
}
一般来说我们要通过new一个对象,然后用对象来调用这个方法
但同样道理地,我们无论是哪个对象,哪个人,他都应该是China,或者说只要是这个类,不需要对象,都应该可以确定他是China,于是我们加上static。
public static void show(){
System.out.println("国籍为" + nation);
}
因为我们之前有设置默认值,所以我们直接通过Chinese调用试试看。
public static void main(String[] args) {
Chinese.show(); //输出“国籍为CHN”
}
总结
static修饰属性(静态属性)
- 当我们创建多个对象的时候,多个对象会共享同一个静态属性,当通过一个对象设置、修改静态变量时,会导致其他对象调用静态对象时,会是修改会设置过了的。
- 静态变量随着类的加载而加载,也可以通过 类.静态变量 的方式来调用。
- 静态变量的加载要早于对象的加载。
- 由于类只加载一次,所以静态对象在内存中也只会存在一份:位于方法区的静态域中。
static修饰方法(静态方法)
- 静态方法随着类的加载而加载,也可以通过 类.静态方法 的方式来调用。
- 静态方法中只能调用静态的方法和属性(因为早于对象的方法存在,所以不能调用)
- 在静态方法中不能使用this和super关键字(同理)