static用于当我们希望无论对象是否产生或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如每个人虽然属性不尽相同,但是国籍和性别基本固定,所以可以将国籍和性别定义为静态,拥有共同属性的公用一份属性,不需要每个对象均占用一个内存
static :静态的
-
1:static 修饰属性、方法、代码块、内部类
注意:static 不能修饰构造器
-
2、static修饰属性:
2.1 静态属性(类变量) vs 非静态属性(实例变量);
实例变量:每个对象拥有独立的一套非静态属性,修改一个对象的属性对其他对象无影响。
静态属性:创建多个对象后,多个对象共享一个静态变量。当通过一个对象修改静态变量时,其他对象调用也是修改过的
2.2 修饰形式:static 数据类型 变量名;
2.3 其他说明:
①静态变量随着类的加载而加载,早于对象的加载,因此不需要实例化,可直接通过 类.静态属性使用。
②由于类❤只会加载一次❤,因此类的静态属性❤存在于方法区的静态域❤(String类型也是)静态属性 非静态属性 类 √ × 对象 √ √
3、static修饰方法:
3.1 随着类的加载而加载,可通过“类.静态方法”使用
静态方法 非静态方法 类 √ × 对象 √ √
3.2 静态方法中只能调用静态属性和方法,非静态方法既可以调用静态的方法和属性,又可以非静态的方法和属性
4、static注意点
4.1、静态方法内不能使用this关键字、super关键字
4.2、关于静态属性和非静态属性可以从生命周期角度去理解
5、工具类通常使用static 修饰,eg:Math、Arrays、Collections
class Chinese {
int age;// 年龄
String name;// 姓名
static String nation;// 国籍
public void eat() {
//非静态方法内可调用静态和非静态属性
System.out.println("name="+name+",age="+age+",nation="+nation);
//非静态方法内可调用静态和非静态方法
show();
test1();
System.out.println("我吃中餐!");
}
public void test1() {
System.out.println("我是一个非静态测试方法!");
}
public static void show() {
// eat(); 静态方法中不可调用非静态方法
System.out.println("我是一个中国人!");
}
public static void info() {
// System.out.println("name="+name); 静态方法中不可调用非静态属性
show(); //静态方法中可调用静态方法
System.out.println("nation="+nation);
}
}
public class Static {
public static void main(String[] args) {
Chinese c1 = new Chinese();
c1.age = 40;
c1.name = "Yao";
c1.nation = "CHN";
Chinese c2 = new Chinese();
c2.age = 30;
c2.name = "Jike";
c2.nation = "UK";
System.out.println(c1.nation);
c1.show();
c1.eat();
System.out.println(Chinese.nation);// 未实例化
Chinese.show();
}
}