- 使用 static 可以修饰变量、方法和代码块。
1.static修饰变量
public class StaticDemo {
/*
1.被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。
2. 静态成员可以使用类名直接访问,也可以使用对象名进行访问。
3.静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收
*/
static String hobby="abc";
public static void main(String[] args) {
System.out.println("通过类名来访问hobby:"+StaticDemo.hobby);
StaticDemo sd = new StaticDemo();
System.out.println("通过对象名访问hobby:"+sd.hobby);
//使用对象名的形式修改静态变量的值
sd.hobby="123";
//再次通过对象名访问静态变量,值已被修改
System.out.println("通过对象名访问hobby:"+sd.hobby);
}
}
通过类名来访问hobby:abc
通过对象名访问hobby:abc
通过对象名访问hobby:123
2.static修饰方法
- static 修饰方法,称为静态方法或类方法。
public class StaticDemo {
String name="张三";
static String hobby="java";
//静态方法
public static void print(){
//1.静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。
System.out.println("爱好:"+hobby);
//2.如果希望在静态方法中调用非静态变量,可以通过创建类的对象,
//然后通过对象来访问非静态变量
StaticDemo sd = new StaticDemo();
System.out.println("姓名:"+sd.name);
}
//3.普通成员方法中,可以直接访问同类的非静态变量和静态变量
public void show(){
System.out.println("姓名:"+name);
System.out.println("爱好:"+hobby);
}
/*
* 4.静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法
* main方法就是静态方法
*/
public static void main(String[] args) {
print();
StaticDemo sd = new StaticDemo();
sd.show();
}
}
爱好:java
姓名:张三
姓名:张三
爱好:java
3.static修饰初始化块
- 静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
public class StaticDemo {
int num1; //声明变量num1
int num2; //声明变量num2
static int num3;//声明静态变量num3
public StaticDemo(){//构造方法
num1=91;
System.out.println("通过构造方法为变量num1赋值");
}
{ //初始化块
num2=74;
System.out.println("通过初始化块为变量num2赋值");
}
static{ //静态初始化块
num3=83;
System.out.println("通过静态初始化块为静态变量num3赋值");
}
public static void main(String[] args) {
StaticDemo sd = new StaticDemo(); //创建类的对象
}
}
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
//从运行结果可以看出:程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。
public static void main(String[] args) {
StaticDemo sd = new StaticDemo(); //创建类的对象
System.out.println("num1="+sd.num1);
System.out.println("num2="+sd.num2);
System.out.println("num3="+num3);
}
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
num1=91
num2=74
num3=83
public static void main(String[] args) {
StaticDemo sd = new StaticDemo(); //创建类的对象
System.out.println("num1="+sd.num1);
System.out.println("num2="+sd.num2);
System.out.println("num3="+num3);
StaticDemo sd1 = new StaticDemo(); //创建类的对象
}
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
num1=91
num2=74
num3=83
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
由于静态初始化块只在类加载时执行一次,所以当再次创建对象sd2时并未执行静态初始化块。