1. 为什么要使用static成员
有一些通过类实例化出的对象,它们具有相同的特点,在实例化一个类时候,每次都实例化相同的属性或方法,显得有些麻烦,所以我们便引入了static成员。
static成员,又叫静态成员,也可以称作类成员,其不属于某个具体的对象,它是所有对象索共有的。下面我们拿“学生类”来举例。
public class Student {
public String name;
public int age;
public String classroom;
public Student(String name, int age, String classroom) {
this.name = name;
this.age = age;
this.classroom = classroom;
}
public void classbegin(){
System.out.println("在同一间教室上课");
}
public static void main(String[] args) {
Student s1=new Student("张三",20,"111");
s1.classbegin();
Student s2=new Student("李四",19,"111");
s2.classbegin();
}
}
从这段代码中,我们发现,张三和李四上课的教室是同一间教室,都是111班,这样每一次都对classroom进行初始化和每次调用classbegin方法显得过于麻烦,所以我们对以上代码使用类成员进行改进。
public class Student {
public String name;
public int age;
public static String classroom="111";
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static void classbegin(){
System.out.println("在同一间教室上课");
}
public static void main(String[] args) {
Student s1=new Student("张三",20);
Student s2=new Student("李四",19);
Student.classbegin();//这里先不用管,讲到后面会明白
}
}
2.static修饰成员变量
static修饰的成员变量,称为静态成员变量
静态成员变量的特点:
- 不属于某一个对象,是类的属性,是所有对象所共有的(最大的特点)
- 既可以通过对象访问(会报警告),也可以通过类名访问,更推荐第二种。
- 类变量储存在方法区中
- 生命周期伴随类的一生(随着类的加载而创建,随着类的销毁而销毁)
3.static修饰成员方法
我们对以上“学生类”代码进行一些简单修改
public class Student {
public String name;
public int age;
private static String classroom = "111";
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static String classbegin() {
//System.out.println(this.name); error
return classroom;
}
}
public class Test {
public static void main(String[] args) {
Student s1=new Student("张三",20);
Student s2=new Student("李四",19);
System.out.println(Student.classbegin());
}
}
我们把类中的classroom进行了封装限定,并通过公开的classbegin接口来获取到classroom,并把主函数移动到了一个不同的类当中,在主函数中使用类名来访问classbegin方法。
从以上代码,我们可以看出static修饰成员方法的一些特点:
- 不属于某个具体的对象,是类方法
- 既可以通过对象访问(会报警告),也可以通过类名访问,更推荐第二种。
- 不可以在静态方法中访问任何非静态成员变量
- 同上面第三条的原理在静态方法中不可以调用任何非静态的方法
- 但是反过来,非静态的成员变量可以调用静态成员变量,举例如下。
public class Student {
public String name;
public int age;
private static String classroom = "111";
public void test(){
classbegin();//未报错
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public static String classbegin() {
return classroom;
//this.test; error
}
}
public class Test {
public static void main(String[] args) {
Student s1=new Student("张三",20);
Student s2=new Student("李四",19);
System.out.println(Student.classbegin());
}
}
静态方法无法重写,无法实现多态(后面会讲到)
4.static成员变量的初始化
注意:static成员变量不可以放在构造方法中来初始化
他的初始化方法只有两种,就地初始化和静态代码块初始化
- 就地初始化是指:在定义的时候就给出初始值,就如上面的“学生类”
private static String classroom = "111";
- 静态代码块初始化
下一篇博文会讲到