static--静态修饰符,可以用来修饰变量,方法,代码块等
1.普通变量与静态变量在内存中的储存
描述了一个学生类,包括名字,年龄,性别还有静态的教室等成员变量,实例化三个学生对象,观察他们的内存:
public class Student { private String name; private int age; private String sex; private static String ClassRoom="7B201"; public Student(String name,int age, String sex){ this.name=name; this.age=age; this.sex=sex; } }package com.dgut.TestStatic; public class Test { public static void main(String[] args) { Student student1=new Student("zhangsan",19,"男"); Student student2=new Student("lisi",20,"男"); Student student3=new Student("wangwu",19,"男"); } }
从上面的三个对象对应内存可以观察得到,包括了名字,性别,年龄,但是都不包括教室这样一个静态变量。在JAVA中,被static修饰的成员,被称为静态成员,也称为类成员,不属于某一个具体的实例化对象,而是被所有对象所共享。
2.static修饰成员变量
static修饰的变量称为静态成员变量,静态成员变量最大的特点就是不属于某一个实例化对象的,而是所有对象的共有属性。
【静态成员变量特性】
- 不属于任何一个对象,是类属性,是所有实例化对象的共有属性。
- 可以用实例化对象访问,也可以用类名访问,更推荐后者。
- 在内存上静态成员变量不存在某一个实例化对象的内存中,而是存在方法区,且仅有一份。
- 生命周期:随着类的加载而加载,随着类的销毁而销毁。
public class Student { //.... private static String ClassRoom="7B201";//静态成员变量 public Student(......)//有参构造方法 public static void main(String[] args) { Student student1=new Student("zhangsan",19,"男"); System.out.println(student1.ClassRoom);//7B201 System.out.println(Student.ClassRoom);//7B201 } }
3.static修饰成员方法
Java中,static修饰的成员方法被称为静态成员方法,也被称为类方法。就是类的方法,不属于某一个实例化对象,而是所有对象的共享属性。
【静态成员方法特性】
- 静态成员方法不允许访问任何非静态的成员变量或者方法。(是因为静态的成员和方法是随着类的加载而加载的,而非静态的在静态加载的时候还没有加载进内存,相当于拿不到,所以在静态方法中是访问不到任何非静态的,)
- 不属于任何一个对象,是类的属性,类方法,是所有实例化对象的共有属性。
- 可以用实例化对象访问,也可以用类名访问,更推荐后者。
- 生命周期:随着类的加载而加载,随着类的销毁而销毁。
public class Student {
...... //Student的成员变量
private int age;
private static String ClassRoom="7B201";
public Student(.....){//有参构造方法
public void fun(){ //普通方法
System.out.println(age);
System.out.println(ClassRoom);
System.out.println("非静态方法");
}
public static void func(){ //静态方法
System.out.println(age); //报错,静态方法中无法访问非静态
System.out.println(ClassRoom);
System.out.println("静态方法");
}
public static void main(String[] args) {
Student student1=new Student("zhangsan",19,"男");
student1.func();
Student.func();
}
}
4.static变量初始化
static变量的初始化分为两种,一种是就地初始化,一种是用静态构造代码块初始化。
-
就地初始化
就是在创建静态变量时就赋值;
private static String name="zhangsan";
private static int age=20;
-
代码块初始化
运用静态代码块给未赋值的静态变量赋值,而且也只能用静态代码块。(前面说过在非静态中不能调用静态的变量的变量或者方法,因为静态是依赖对象的,是属于类的属性,非静态的是依赖对象的。)
class Studsent{
private static String name;
private static int age;
static {
name="zhangsan";
age=20;
}
}