1 静态概述
-
静态:
static
关键字,静态、静止的。静态变量不会随着对象的变化而变化。 -
加载时机:
-
随着类的加载而加载。
-
静态变量随着类的加载进方法区,就直接在静态区给开辟了存储静态变量的内存空间。
-
-
静态变量优先于对象而存在。
-
静态变量被所有该类对象所共享。
-
代码层面:可以使用类名直接调用,不需要使用对象名称。在不创建对象的前提下,仍然可以使用这个静态变量。
-
强烈建议使用类名来访问。
2. 静态效果
-
不使用静态:
-
现象:如果某个类型的所有对象,都具有一个相同的属性值,比如2个对象的age都是23; 那么这个属性值就没有必要在所有对象中,都存储一份。
-
缺点:浪费内存空间;维护难度大,一旦需要修改,就得修改所有的对象。
-
示例:
public class Demo { String username; String country; public static void main(String[] args) { Demo d1 = new Demo(); d1.username = "张三"; d1.country = "中国"; Demo d2 = new Demo(); d2.username = "李四"; d2.country = "中国"; } }
使用静态:
-
现象:如果某个类型的所有对象,都具有一个相同的属性值,那么就在这个属性的定义上,加一个static静态关键字。让该变量存储在方法区字节码的静态区中,避免了所有对象都存储相同数据的问题,节省了内存空间,将来维护容易(只需要修改一次)。
-
示例:
-
class Animal { int age; // 添加静态属性 static String type; } class Demo { public static void main(String[] args) { Animal animal = new Animal(); System.out.println(animal.age); animal.type = "金渐层"; System.out.println(animal.type); Animal animal1 = new Animal(); System.out.println(animal1.type); Animal.type = "银渐层"; System.out.println(animal1.type); } }
-
注意事项:
-
静态方法:在方法声明上,加上了
static
关键字的方法,就是静态方法。 -
静态方法不能访问非静态的变量:静态方法本身可以在没有创建对象的时候调用;非静态的变量只有在对象创建之后才存在。如果静态方法可以访问非静态的变量,那么就相当于在对象创建之前,就访问了对象创建之后的数据。明显不合理。
-
静态方法不能访问非静态的方法:静态方法可以在没有创建对象的时候调用;非静态的方法可以访问非静态的变量。如果静态方法可以访问非静态的方法,就相当于静态方法间接的访问了非静态的变量,和第2点矛盾。
-
静态方法中不能存在
this
关键字:this
关键字表示本类当前对象。静态方法可以在对象创建之前调用。如果静态方法可以访问this
关键字,相当于在创建对象之前,就使用了对象本身。矛盾。 -
总结:静态资源不能访问非静态资源
-
-
概念上,所属不同:
-
非静态变量属于对象。
-
静态变量属于类,类变量。
-
-
内存空间不同,存储位置不同:
-
非静态变量属于对象,所以存储在堆内存中。
-
静态变量属于类,存储在方法区的静态区中。
-
-
内存时间不同,生命周期不同:
-
非静态变量属于对象,所以生命周期和对象相同,随着对象的创建而存在,随着对象的消失而消失。
-
静态变量属于类,所以生命周期和类相同,随着类的加载。
-
-
访问方式不同:
-
非静态变量只能使用对象名访问。
-
静态变量既可以使用对象访问,也可以通过类名访问(强烈建议使用类名访问):
-
类名.静态变量名
-
类名.静态方法名()
-
-
-
3 静态变量和非静态变量的区别
-
概念上,所属不同:
-
非静态变量属于对象。
-
静态变量属于类,类变量。
-
-
内存空间不同,存储位置不同:
-
非静态变量属于对象,所以存储在堆内存中。
-
静态变量属于类,存储在方法区的静态区中。
-
-
内存时间不同,生命周期不同:
-
非静态变量属于对象,所以生命周期和对象相同,随着对象的创建而存在,随着对象的消失而消失。
-
静态变量属于类,所以生命周期和类相同,随着类的加载。
-
-
访问方式不同:
-
非静态变量只能使用对象名访问。
-
静态变量既可以使用对象访问,也可以通过类名访问(强烈建议使用类名访问):
-
类名.静态变量名
-
类名.静态方法名()
-
-
-