3.1.9 static关键字
在定义一个类时,只是在描述某事物的特征和行为,并没有产生具体的数据。只有通过new关键字创建该类的实例对象时,才会开辟栈内存及堆内存,在堆内存中要保存对象的属性时,每个对象会有自己的属性。
如果想要有这样的类成员,在没有创建对象的情况下,就可以访问,该怎么做呢?
这样的成员(属性/方法)可以用static修饰。
静态属性
在类中使用static修饰的属性称为静态属性(也称全局属性),静态属性可以使用类名直接访问,访问格式如下:
类名.属性名
也可以通过对象名.属性名访问
注意,某个对象修改了静态属性的值,别的对象再访问时获取的就是修改后的值。
例1:
class Student{
String name;
static String school="清华大学";
public Student(String name){
this.name=name;
}
public void show(){
System.out.println("姓名:"+name+",学校:"+school);
}
}
public class Test{
public static void main(String[] args){
Student stu1=new Student("张三");
Student stu2=new Student("李四");
stu1.show();
stu2.show();
}
}
上面的代码运行结果是:
姓名:张三,学校:清华大学
姓名:李四,学校:清华大学
如果修改一下main方法:
Student stu1=new Student("张三");
Student stu2=new Student("李四");
stu1.school="北京大学";
stu1.show();
stu2.show();
上面的代码运行结果是:
姓名:张三,学校:北京大学
姓名:李四,学校:北京大学
可以看到,通过stu1.school=“北京大学”,修改了静态属性school的值,再通过stu2访问school时获得的就是修改后的值。
所以静态属性就是类的“全局属性”,是属于类的属性,面向该类的所有对象公开,所有对象都可以访问或修改。
打个比方,就像寝室的空调,是寝室的公共电器,寝室的所有同学都可以调温度,某个同学调了空调的温度,自然会影响到全寝室的所有同学。
静态方法
与静态属性一样,也可以用static修饰方法,这种方法属于类的方法,可以不需要创建对象,通过类名访问。当然该类的所有对象也可以访问这个静态方法。
例2:
class Student{
String name;
static String school="清华大学";
public Student(String name){
this.name=name;
}
public static void show(){
System.out.println("学校名称:"+school);
}
}
public class Test{
public static void main(String[] args){
Student.show();
Student.school="北京大学";
Student.show();
}
}
上面的代码运行结果是:
学校名称:清华大学
学校名称:北京大学
注意:
在普通方法中可以访问所有静态或非静态的成员,例如上面例1中Student类的show方法,但是在静态方法中只能访问静态成员,例如上面例2中Student类的show方法,如果想在静态方法中访问非静态成员,会报错。
class Student{
String name;
static String school="清华大学";
public Student(String name){
this.name=name;
}
public static void show(){
System.out.println("姓名:"+name+"学校名称:"+school);
}
}
上面的show方法中,试图访问非静态属性name,程序报错。