在java中static可以⽤来修饰成员变量、修饰成员⽅法、构造静态代码块以及实现静态内部类。
1.static修饰成员变量
通常将⽤ static 修饰的成员变量称为 类成员或者静态成员
static 修饰的成员变量与普通成员变量的区别:
static修饰的成员变量
public class test01 {
private static int age;
private String name;
@Override
public String toString() {
return "test{" +
"name='" + name + '\'' +
"age='"+age+'\''+
'}';
}
public test01(String name, int age) {
this.name = name;
this.age=age;
}
}
普通成员变量
public class test03 {
private String name;
private int age;
public test03(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "test03{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试
public class test02 {
public static void main(String[] args) {
test01 r=new test01("name1",12);
test01 a=new test01("name2",10);
System.out.println(r.toString());
System.out.println(a.toString());
test03 r1=new test03("name1",18);
test03 a1=new test03("name2",20);
System.out.println(r1.toString());
System.out.println(a1.toString());
}
}
static成员变量结果
test{name='name1'age='10'}
test{name='name2'age='10'}
普通成员变量
test03{name='name1', age=18}
test03{name='name2', age=20}
从结果可以看出static修饰的变量,其输出age都是10,并不是12、10,而普通成员变量正常输出。原因如下
这是因为⽤在 jvm 的内存构造中,会在堆中开辟⼀块内存空间,专⻔⽤来存储⽤ static 修饰的成员 变量,称为静态存储区,⽆论我们创建多少个对象,⽤ static 修饰的成员变量有且只有⼀份存储在静态 存储区中,所以该静态变量的值是以最后创建对象时设置该静态变量的值为准,也就是由于 r1 先设置 age = 12,后来创建了 a1对象,a1将 age 改为了10,最后该静态存储区的 age 属性值也被修改成了 20
2、修饰修饰成员⽅法
⽤ static 关键字修饰成员⽅法也是⼀样的道理,我们可以直接通过 类名.静态⽅法名() 的⽅式来调 ⽤,⽽不⽤创建对象
public class test04 {
public static void test(){
System.out.println("hello world");
}
}
类名.静态⽅法名() 的⽅式来调⽤、⽽不⽤创建对象
public class test02 {
public static void main(String[] args) {
test04.test();
}
}
3、静态代码块
⽤ static 修饰的代码块称为静态代码块,静态代码块可以置于类的任意⼀个地⽅(和成员变量成员 ⽅法同等地位,但不可放⼊⽅法中),并且⼀个类可以有多个静态代码块,在类初次载⼊内存时加载静态 代码块,并且按照声明静态代码块的顺序来加载,且仅加载⼀次,优先于各种代码块以及构造函数
public class test04 {
static{
System.out.println("代码块内容编写");
}
}