小白对static修饰符的理解
要说权限控制修饰符public、private、protected的功能和使用肯定是每个java使用者的核心基础知识,但随后紧跟的static静态修饰符却在初级学习的过程中很少接触到。这里就来讲一下小白角度的static修饰符理解,提供java编程入门的一点参考。
首先static叫做静态修饰符,被其修饰的任何变量或者代码会在程序运行期间始终存在,不会消失,与程序共存亡。并且静态属性与普通属性的重大使用区别还在于,被静态修饰的变量或方法能够不通过实例化直接调用,而普通变量或方法需要实例化对象后才能调用。
例如Test类就能很好解释这个特性:
public class Test {
public static int a = 5;
public int b = 3;
``````
public static void printStaticHello(){
System.out.println("Hello Static!");
}
public void printNormalHello(){
System.out.println("Hello Normal!");
}
``````
}
现在来调用其中的变量和方法:
//被static修饰的能直接调用(注意都是public权限)
Test.printStaticHello(); //通过类直接调用static方法并正确输出
int i = Test.a; //i被赋值为5
Test.printNormalHello(); //静态编译检查不通过,炸不到printNormalHello方法
int i = Test.b; //同样找不到b
//调用普通变量和方法必须创建实例
Test testIntsance = new Test(); //testIntsance 作为new出来的实例(对象)
int j = testIntsance.b; //拥有实例才能使用没有static修饰的变量
testIntsance.printNormalHello(); //同上
此时通过初步学习,我们知道static表示不要实例化就可以使用。
接下来需要了解的是,被static修饰的部分,与这个类(Class)牢牢绑定在一起。也就是说,实例是Object层面,而被static修饰的部分放在了Class层面,一个Class不管会不会被用到,它在程序编译结束的时候都会进行载入内存。被修饰的部分成为了永恒属性,在程序运行的任意时刻都可以对其进行操作,例如:
Test.a = 10; //修改了静态变量a
Test testIntsance1 = new Test();
System.out.println(testIntsance1.a); //输出不再是5而是修改后的10
System.out.println(testIntsance1.b); //输出是3
testIntsance1.a = testIntsance1.a + 5;
testIntsance1.b = testIntsance1.b + 5;
Test testIntsance2 = new Test();
System.out.println(testIntsance2.a); //输出不是10而是加五后的15
System.out.println(testIntsance2.b); //b是普通变量,在实例创建的时候被赋值,所以还是输出是3
不管在什么时候在哪里new出实例,一个类的static属性在某一时刻只有一个值,并且对这个类的实例共享。所以Class中定义的static变量值只是初始状态值,在程序运行过程中随时可能发生变化,比如Test中定义a为5,但new出来的testIntsance2 观察a值却是15,而b为3。
作为编程新人,了解如上static使用事项后足够对付初级代码理解。
据我所知,static的常见应用还在于常量的定义和构造静态工厂方法。
常量的定义例如:
public class StudentNumberConstants {
public static final int UPPER_LIMIT_CLASSROOM = 150;
public static final int UPPER_LIMIT_ROOMMATE = 6;
public static final int LOWER_LIMIT_TEAM = 4;
``````
}
在使用时调用常量更安全且更有逻辑,例如:
public createTeam(List<String> names) {
if (names.size() < StudentNumberConstants.LOWER_LIMIT_TEAM){
`````
}
}
构造静态工厂方法则是软件设计模式的一种思想,用途在于隔离客户端可见和开发端代码实现,需要较为系统的软件构造知识作为理解基础,此处不过多展开。