static关键字
修饰成员变量
static修饰的成员变量称为静态成员变量。
public class Student {
String name;
String gender;
int age;
double score;
public Student(String name, String gender, int age, double score) {
this.name = name;
this.gender = gender;
this.age = age;
this.score = score;
}
public static void main(String[] args) {
Student student1=new Student("Lihua","男",18,3.9);
Student student2=new Student("Hanlei","女",17,4.2);
Student student3=new Student("Jim","男",18,2.6);
}
}
假设上面的三个学生在一个班级,只需要一个静态变量。
三个学生即三个对象。静态变量属于类,不属于对象,为所有对象共有。
static String classRoom="1班";
静态成员变量虽然属于类,但可以通过对象访问
System.out.println(student1.classRoom);
System.out.println(student2.classRoom);
System.out.println(student3.classRoom);
打印结果都是1班,但不建议。因为静态变量属于类,可以直接用
类名. 访问静态成员变量
System.out.println(Student.classRoom);
静态成员变量:1.通过对象访问;2.通过类名访问。推荐类名访问。
静态的,是类的属性,与有无对象无关(不依赖对象)。
静态成员变量存储在方法区。所有对象共用静态成员。
生命周期随着类加载诞生,随着类卸载销毁。
public class Student {
String name;
String gender;
int age;
double score;
static String classRoom="1班";
public Student(){
}
public Student(String name, String gender, int age, double score) {
this.name = name;
this.gender = gender;
this.age = age;
this.score = score;
}
public static void main(String[] args) {
// Student student1=new Student("Lihua","男",18,3.9);
// Student student2=new Student("Hanlei","女",17,4.2);
// Student student3=new Student("Jim","男",18,2.6);
// System.out.println(student1.classRoom);
// System.out.println(student2.classRoom);
// System.out.println(student3.classRoom);
Student s=new Student();
s=null;
System.out.println(s.classRoom);
}
}
不依赖对象,不会报错:空指针异常。
修饰方法
Java中在类中static可以修饰成员方法,此时其被称为静态成员方法,是类的方法,不为某个对象每个成员特有。静态成员一般通过静态方法访问。
成员方法 + static = 静态成员方法。
静态成员方法属于类,不依赖对象
可以通过对象调用但与对象取何值无关。因为可以理解实质上把对象当作相应的类型在调用。
//Student.java
public class Student {
private static String classRoom = "1班";
public static String getClassroom(){
return classRoom;
}
}
//Test.java
public class Test{
public static void main(String[] args) {
System.out.println(Student.getClassroom());
}
}
以上操作就通过静态成员方法访问到了Student类的静态成员变量classRoom。
静态成员方法特性
- 不属于某个具体的对象,是类方法。
- 可以创建对象调用静态方法,但我们更喜欢类名.静态成员方法名(参数)
- 静态方法只能调用静态变量/静态方法。言外之意:不能调用非静态成员和方法。
静态变量初始化
1.就地初始化
我们在类中定义静态变量时初始化给定一个值。
private static String classRoom = "1班";
2. IDEA自带的get,set方法初始化
静态非静态都适用
3.构造方法初始化
//Student.java
public class Student {
String name;
int age;
public static String classRoom;
public Student(String classroom ){
classRoom = classroom;
}
}
//Test.java
public class Test{
public static void main(String[] args) {
Student std1= new Student("2班");
System.out.println(std1.classRoom);
}
}
4.默认初始化
定义静态变量时啥也不做,它会默认有一个初始值。前面已经提过每种类型默认初始值是啥了。
5.静态代码块
详情看下面代码块的内容
代码块
普通代码块
普通代码块:定义在方法中的代码块。
//Test.java
public static void main(String[] args) {
{
int x = 0;
System.out.println("x = " + 10);
}
int x=10;
System.out.println("x = "+ 20);
}
实例代码块
//Student.java
public class Student {
String name;
int age;
//类内方法外,不加修饰只有花括号括起来的部分。一般用于初始化实例(普通)成员变量
{
this.name="hello";
this.age=10;
}
public static String classRoom;
public Student(String classroom ){
classRoom = classroom;
}
}
静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量
static {
classRoom = "class 1";
//name="fafa";error,静态代码只能初始化静态变量
}
- 静态代码块不管生成多少个对象,其只会执行一次
- 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
- 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
- 实例代码块只有在创建对象时才会执行