Java中各种关键字 transient、instanceof、volatile、final、static 。
transient
一个对象只要实现了 Serializable 接口,这个对象就可以被序列化,Java 的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了 Serializable 接口,这个类的所有属性和方法都会自动序列化。
然而在实际开发过程中,一个类中并不是所有属性都需要进行序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上 transient
关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
小结:
- 一旦变量被 transient 修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
- transient 关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被 transient 关键字修饰的。变量如果是用户自定义类变量,则该类需要实现 Serializable 接口。
- 被 transient 关键字修饰的变量不再能被序列化,一个静态变量不管是否被 transient 修饰,均不能被序列化(静态变量的值不是从序列化得到,而是从 JVM 中得到)。
注意:
- Java 中的关键字
transient
是用来标识一个属性不被序列化的,而 JPA 的@Transient
注解是用来标识一个属性不被持久化到数据库的。 - 若实现的是 Externalizable 接口,则没有任何东西可以自动序列化,需要在 writeExternal 方法中进行手工指定所要序列化的变量,这与是否被 transient 修饰无关。
instanceof
可以用来检查对象是否是特定类的实例。比如,当您有一个对超类或接口类型的对象的引用或参数,你想知道实际对象是否有其他类型(通常更具体)时,可以使用它。
1 | public void doSomething(Number param) { |
注意:使用 instanceof 之前不需要做 null 检查,假如 x 是 null,则 x instanceof SomeClass
就是 false。
volatile
参考 volatile关键字
final
在 Java 中,被 final
修饰代表不能被改变。
- final 修饰的类不能被继承,但是可以继承其他类。
- inal 修饰的变量在定义时,必须赋值,并且只能赋值一次
- final 修饰的方法不能被重写。
- final 修饰的引用型变量,变量的值是固定不变的。注意:对象的引用值和对象的属性值!
注意:使用 final
关键字它能会提高性能,但充其量只是略微提高。还是根据实际需要去使用。
static
当我们通过 new 关键字去创建对象的时候,那么数据的存储空间才会被分配,类中的成员方法才能被对象所使用。有两种特殊的情况:
- 我们通过 new 关键字创建的对象共享同一个资源,而不是说每个对象都拥有自己的数据,或者说根本就不需要去创建对象,这个资源和对象之间是没有关系的。
- 希望某个方法不与包含它的类的任何对象联系在一起。
总结下来就是说:即使没有创建对象,也能使用属性和调用方法,static 目的就是在于解决这个问题。
- static 可以修饰变量、方法。
- 被 static 修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
- 在类被加载的时候,就会去加载被 static 修饰的部分。
- 被 static 修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
静态变量
被 static 修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被 static 修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。
静态方法
被 static 修饰的方法也叫做静态方法,因为对于静态方法来说是不属于任何实例对象的,那么就是说在静态方法内部是不能使用 this 的,因为既然不属于任何对象,那么就更谈不上 this 了。
Java 嵌套类分为两种,静态嵌套类和非静态嵌套类,其中非静态嵌套类才是真正的内部类。
enum
参考 枚举类型