引入static
当我们引入一个学生类,这个类里面包括名字、性别、年龄、成绩等等
用这些信息对学生进行描述,假若有三个同学
假如这三个同学都是一个班的,那么就会在一个教室上课,在同一个教师,那么我们可以在类中再加上一个班级的成员变量来保存同学们上课的班级吗?
答案是不行的。
有没有别的解决方法, 有!
那就是引入一个static成员,因为这个班级的属性不是每个学生中要去存储一份,而是可以需要让所有同学来共享。那么在java中,被static修饰的成员,被称为静态成员,也可以叫做类成员,不属于某个具体对象的属性,而是所有对象共享的。
static修饰成员变量
static修饰的成员变量,称为静态成员变量。它最大的特征就是上面说过的:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量的特性】
- 不属于某个具体的对象,是类的属性,所有对象所共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,
- 类变量存储在方法区中
- 生命周期伴随类的一生(类创建它创建,类消失它消失)
举个例子
public class Student {
public String name;
public String gender;
public int age;
public double score;
public static String classname = "2501";
public Student(String name, String gender, int age, double score) {
}
public static void main(String[] args) {
//静态成员变量可以直接通过类名访问
System.out.println(Student.classname);
Student s1 = new Student("li lei","男",18,4.5);
Student s2 = new Student("wang lei","男",19,4.5);
Student s3 = new Student("yi lei","男",17,4.5);
System.out.println(s1.classname);
System.out.println(s2.classname);
System.out.println(s3.classname);
}
}
static修饰成员方法
还是拿上面的例子,在我们实际应用开发时,都会将类中的数据成员设置为private,而成员方法设置为public,这样设置之后,Student类中的classRoom属性如何在类外访问?
我们拿具体的例子实践一次
class Student {
private String name;
private String gender;
private int age;
private double score;
private static String classname = "2501";
}
public class TestStudent{
public static void main(String[] args) {
System.out.println(Student.classname);
}
}
我们会发现
那么这种情况,static属性应该如何访问?
在java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。
静态成员一般是通过静态方法来访问的,所以我们只需要写一个static方法即可访问
class Student {
private String name;
private String gender;
private int age;
private double score;
private static String classname = "2501";
public static String getClassname(){
return classname;
}
}
public class TestStudent {
public static void main(String[] args) {
System.out.println(Student.getClassname());
}
}
由此
【静态方法特性】
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过 类名.静态方法名(...) 调用
- 不能在静态方法中访问任何非静态成员变量
- 静态方法不能调用任何非静态方法,因为静态方法有this参数,在静态方法中调用时候无法传递this引用
- 静态方法无法重写,不能用来实现多态
针对③和④小点,仔细说一下
不能在静态方法中访问任何非静态成员变量
例如,无法从静态上下文引用非静态变量this
以及,无法从静态上下文引用非静态变量age
静态方法不能调用任何非静态方法,因为静态方法有this参数,在静态方法中调用时候无法传递this引用
只要是非静态方法的数据成员,都是需要通过对象的引用才能调用。