我们实例化了三个个学生类的对象
例如:
public class Student {
String name;
int age;
float score;
public Student(String name, int age, float score){
this.name = name;
this.age = age;
this.score = score;
}
public static void main(String[] args) {
Student s1 = new Student("小明",15,4.0f);
Student s2 = new Student("小红",14,4.1f);
Student s3 = new Student("小黄",16,3.8f);
}
}
三个学生具有三个属性,名字 年龄 学分,这三个都是对象自己特有的属性,现在假设三个同学是同一个班级的,就会在同一间教室上课,那么我们需不需要再定义一个成员变量表示,学生们上课时的教室呢?
答案是不需要的,因为在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】:
public class Student {
public String name;
public int age;
public float score;
public static String classroom = "101";
public Student(String name, int age, float score){
this.name = name;
this.age = age;
this.score = score;
}
public static void main(String[] args) {
System.out.println(Student.classroom);//可以通过类名访问
Student s1 = new Student("小明",15,4.0f);
Student s2 = new Student("小红",14,4.1f);
Student s3 = new Student("小黄",16,3.8f);
//也可以通过对象来访问
System.out.println(s1.classroom);
System.out.println(s2.classroom);
System.out.println(s3.classroom);
}
}
运行之后我们可以通过监视来看到classroom并没有存到某一个对象里面
一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,在不同一个类就不能访问成员变量,Student类中classRoom属性如何在类外访问呢?
这是就体现了Java的面向对象思想,对象的成员变量相当于cpu 内存,对用户不开放,我们能操控的只有键盘鼠标等函数接口,类似的我们可以写一个public的成员方法得其成员变量。
这样就解决了private修饰的成员变量的问题,这种不能直接访问对象的成员变量用一个接口去访问大大提高了程序的安全性。
同理的我还可以写一个set接口来设置修改对象的成员变量
这里IDEA提供有一个快速写好成员变量的get和set的方式
我们 点击右键 点击Generate(生成)再点击Getter and Setter
然后再摁下ctrl键 点击你要生成的成员变量的get和set的方法就能快速生成了。
那static属性应该如何访问呢?
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
可以看到通过对象来访问是不行的,一定要通过类来访问
输出:101
【静态方法特性】
public static String getClassRoom(){
System.out.println(this);
return classRoom;
}
// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
public static String getClassRoom(){
age += 1;
return classRoom;
}
// 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量age
public static String getClassRoom(){
doClass();
return classRoom;
}
// 编译报错:Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。
public class Student{
private String name;
private String gender;
private int age;
private double score;
private static String classRoom = "Bit306";
// ...
}
2. 静态代码块初始化
在代码块的学习中会说明。