static checking
静态检查发生在程序运行之前。Java是一种静态类型的语言。所有变量的类型都是在编译时(在程序运行之前)声明并检查,因此编译器也可以推断出所有表达式的类型。
下面是我结合所学内容对静态检查的理解与总结。
静态检查是对类型的检查,而非对特定值的检查。如果只有当某变量被赋予了某些特定的值才会在产生bug,那么这个错误是由动态检查所检测出来的,而非静态检查。
上面说过,静态检查主要是对类型的检查,具体来说是对“类型匹配”的检查。当编译器检测到某些变量与声明说好的不一样,就会触发一个静态检查错误。
以上是对静态检查的概念的说明,在实际的应用上,static checking在IDE中发生在编写代码的过程中。下面总结static checking发生的时刻即对应的错误。
1.语法错误
这是静态检查能检测到的最基本的错误,当我们编写代码的时候发生了语法错误,IDE会很快的反应,触发错误。
2.在方法中的匹配错误
private int sum(int a, int b){
return a + b;
}
对于这样一个方法,在方法内部可能会出现:
返回值与声明不匹配的错误;
在调用该方法时,可能会出现:
传参的个数与spec中参数的个数不匹配;
调用的名字与方法实际名字不匹配;
传参的类型与spec的参数类型不匹配;
3.final检查
java中final修饰的变量或对象是不可修改的。如果出现了对final修饰的变量或对象的修改,静态检查会触发错误。
4.Immutable检查
与上述的final检查类似,当我们试图对一个Immutable的对象进行修改其内部的操作时,静态检查会触发错误。
一个典型的例子:
List是mutable的类型,要想获得起对应的immutable的List,需要Collection类的unmodifiableList方法,此时的List就是immutable的了。
5.对private的检查
在一个类中,private修饰的fields或methods只能供该类访问或调用。这里的该类甚至可以是该类的多个对象。而当该类以外的类想要访问时,会触发静态错误。
例如,我们首先写一个Person类
我们在其他类访问其中的fields会报错:
只有在本类中不会: