很多初学的小伙伴都认为static关键字难以理解,容易和其他关键字混淆,特别是搭配使用的时候。static关键字的用法其实并不难理解,关键在于是否熟练关键字的具体概念以及相关用法。只有把概念彻底吃透了,才能运用到逻辑中。毕竟,“先有模仿,才能创造”。
static修饰成员变量
static修饰成员变量,该变量属于类级别,在对象创建之前就已经在内存中加载好,每一个对象都共享这一个静态变量,通过(创建不同的对象调用,但没必要)类名.属性名的方式可以获取到属性,也可以修改属性值,因为是共享所以,可以被随意更改,获取到的属性值,与上一次被修改后的值一致
package Demo01;
public class Dog {
static String name = "金毛";
}
package Demo01;
public class Test {
public static void main(String[] args) {
Dog dog1 = new Dog();
System.out.println(dog1.name = "泰迪");//泰迪
Dog dog2 = new Dog();
System.out.println(dog2.name = "边牧");//边牧
Dog dog3 = new Dog();
System.out.println(dog3.name);//边牧
}
}
运行结果:
泰迪
边牧
边牧
不通过创建对象结果也是一样,因为static修饰的成员变量已经是属于类了,创建对象之前就已经存在(以上创建对象获取静态成员变量的方式仅作为理解,实际开发不要这样写)
package Demo01;
public class Test {
public static void main(String[] args) {
System.out.println(Dog.name = "泰迪");//泰迪
System.out.println(Dog.name = "边牧");//边牧
System.out.println(Dog.name);//边牧
}
}
运行结果:
泰迪
边牧
边牧
final static修饰成员变量
final意为“最终的,不可更改的”,final static修饰成员变量后,成员变量将不可以随意更改,仅仅可以获取,如果强行更改属性值会报错:Cannot assign a value to final variable 'name',无法更改一个被final修饰的"name"
package Demo01;
public class Dog {
final static String name = "金毛";
}
package Demo01;
public class Test {
public static void main(String[] args) {
System.out.println(Dog.name = "泰迪");//报错:Cannot assign a value to final variable 'name'
System.out.println(Dog.name = "边牧");//报错:Cannot assign a value to final variable 'name'
System.out.println(Dog.name);//金毛
}
}
private static修饰成员变量
private意为“私有的,独有的”,private static修饰成员变量后,外部类将直接无法获取到静态成员变量,强行获取会报错:'name' has private access in 'Demo01.Dog',静态成员变量'name'已经在Demo01.Dog这个类中私有化,外部类Demo01.Test不可访问这个静态变量
package Demo01;
public class Dog {
private static String name = "金毛";
}
package Demo01;
public class Test {
public static void main(String[] args) {
System.out.println(Dog.name = "泰迪");//报错:'name' has private access in 'Demo01.Dog'
System.out.println(Dog.name = "边牧");//报错:'name' has private access in 'Demo01.Dog'
System.out.println(Dog.name);//报错:'name' has private access in 'Demo01.Dog'
}
}
那我们如何访问或修改private static修饰的成员变量呢?
可以用get 或set方法(因为是静态修饰,静态成员变量属于类,所以调用get或set方法直接 类名.属性名 即可)
package Demo01;
public class Dog {
private static String name = "金毛";
//get方法
public static String getName() {
return name;
}
//set方法
public static void setName(String name) {
Dog.name = name;
}
}
package Demo01;
public class Test {
public static void main(String[] args) {
System.out.println(Dog.getName());//用get方法获取私有化的静态成员属性"金毛"
Dog.setName("泰迪");//调用set方法修改私有化的静态成员属性
System.out.println(Dog.getName());//用get方法获取更改后的属性"泰迪"
}
}