Java基础之instanceof和transient关键字用法
instanceof
用于检测指定对象是否是某个类(本类、父类、子类、接口)的实例。Java中的instanceof也称为类型比较运算符,因为它将类型与实例进行比较。 返回true或false。 如果对任何具有null值的变量应用instanceof运算符,则返回false。用法:Boolean result = object instanceof class;
本类对象一定是本类的实例,如果本类有父类或接口,则此对象也是父类或接口的实例;如果本类有子类,则此对象不是子类的实例。如果父类对象引用子类的实例,则此对象是父类到子类之间的继承链上所有类的实例。
例如:如果三个类存在以下继承关系:C继承B,B继承A,即A<-B<-C,
对象 C c=new C();,则c instanceof C为true;c instanceof B为true;c instanceof A为true;
对象A a=new C();,则a instanceof C为true;a instanceof B为true;a instanceof A为true;
对象A a=new A();,则a instanceof C为false;a instanceof B为false;a instanceof A为true;
下面是instanceof的常用用法:
boolean b1 = "Sting" instanceof Object;
b1为true 因为String是Object的子类
boolean b2 = new String() instanceof String;
b2为true
boolean b3 = new Object() instanceof String;
b3为false Object是父类
boolean b4 = 'A' instanceof Character;
编译不通过 ‘A’在此处视为基本数据类型char,instanceof操作符只能用作对象的判断
boolean b5 = null instanceof String;
b5为false 这是instanceof 特 有 的 规 则 : 若左操作数为null, 结果就直接返回false, 不再运算右操作数是什么类。
boolean b6 = (String)null instanceof String;
b6为false 即使类型转换还是个 null
boolean b7 = new Date() instanceof String;
编译不通过 instanceof 操作符的左右操作数必须有继承或实现关系,否则编译出错。
transient
此关键字用于指定一个变量不能被序列化。一个对象只要实现了Serializable接口,这个对象就可以被序列化。我们不必关心具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。然而在实际开发过程中,我们常常会遇到某个类的有些属性需要序列化,而其他属性不需要被序列化,这些不需要被序列化的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
transient关键字为我们提供了便利,你只需要实现Serializable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
被transient关键字修饰的变量某些情况也可以被序列化。在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
转载请注明出处 https://www.cnblogs.com/Y-oung/p/9113323.html
工作、学习、交流或有任何疑问,请联系邮箱:yy1340128046@163.com