详解Java中static关键字的使用
static关键字的引入
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会生成新的对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。
我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。此时代表国家名称的这个变量就可以使用static关键字进行修饰
static关键字的使用
-
static:静态的
-
static可以用来修饰:属性、方法、代码块、内部类
-
使用static修饰属性:静态变量(或类变量)
属性,按是否使用static修饰,又分为:静态属性Vs非静态属性(实例变量)实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
举例:public class Test { public static void main(String[] args) { Chinese ch1 = new Chinese(); Chinese ch2 = new Chinese(); ch1.name = "张三"; ch2.name = "李四"; ch1.age = 20; ch2.age = 18; ch1.nation = "China"; System.out.println(ch2.nation); // 输出China ch2.nation = "USA"; System.out.println(ch1.nation); // 输出USA } } class Chinese{ String name; int age; static String nation; }
static修饰属性的其他说明:
静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
静态变量的加载要早于对象的创建。
由于类只会加载一次,所以静态变量在内存中也只会存在一份,存在方法区的静态域中。 -
静态变量和实例变量的内存解析
内存解析 -
使用static修饰方法:静态方法
随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
静态方法中只能调用静态的方法或属性
非静态的方法中既可以调用静态的方法或属性,也可以调用非静态的方法或属性
举例public class TestTest { public static void main(String[] args) { Chinese.speak(); // 可以直接通过类名调用静态方法 } } class Chinese{ String name; int age; static String nation; public static void speak(){ System.out.println("人说话"); // name = 18; // 静态方法中不能操作非静态的属性 walk(); // 可以调用其他静态方法 } public static void walk(){ } }
-
static注意点
在静态的方法内,不能使用this关键字、super关键字 -
开发中,如何确定一个属性是否要声明为static的?
属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
类中的常量也常声明为static -
开发中,如何确定一个方法是否要声明为static的?
操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static的。比如:Math、Arrays、Collections