JAVA final、static、transient关键字的作用

final关键字的作用

1、被final关键修饰的类不可以被继承
2、被final关键修饰的方法不可以被重写
3、被final关键修饰的变量不可以被改变

被final修饰的变量不可以被改变,什么不可以被变呢,是变量的引用?还是变量里面的内容?

被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的。(切记不可变的是变量的引用而非引用指向对象的内容)

总结:

1、被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的。
2、被final修饰的常量,在编译阶段会存入调用类的常量池中。

static关键字作用

1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来
2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来
3、被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变、处处变。

JDK把不同的静态资源放在了不同的类中而不把所有静态资源放在一个类里面。

1、不同的类有自己的静态资源,这可以实现静态资源分类。
2、避免重名。不同的类之间有重名的静态变量名、静态方法名也是很正常的,如果所有的都放在一起不可避免的一个问题就是名字重复,这时候怎么办?分类放置就好了。
3、避免静态资源类无限膨胀,这很好理解。

静态方法能不能引用非静态资源?静态方法里面能不能引用静态资源?非静态方法里面能不能引用静态资源?

1、静态方法能不能引用非静态资源?不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。
2、静态方法里面能不能引用静态资源?可以,因为都是类初始化的时候加载的,大家相互都认识。
3、非静态方法里面能不能引用静态资源?可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。

静态块

1、静态块里面的代码只执行一次,且只在初始化类的时候执行
2、静态资源的加载顺序是严格按照静态资源的定义顺序来加载的
3、静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问
4、静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次。

序列化、反序列化和transient关键字的作用

序列化 :将一个对象转换成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。
反序列化:将字节数组重新构造成对象。

默认序列化

1、序列化之后保存的是对象的信息
2、被声明为transient的属性不会被序列化,这就是transient关键字的作用
3、被声明为static的属性不会被序列化,这个问题可以这么理解,序列化保存的是对象的状态,但是static修饰的变量是属于类的而不是属于对象的,因此序列化的时候不会序列化它
手动指定序列化过程
进行序列化、反序列化时,虚拟机会首先试图调用对象里的writeObjectreadObject方法,进行用户自定义的序列化和反序列化。如果没有这样的方法,那么默认调用的是ObjectOutputStreamdefaultWriteObject以及ObjectInputStreamdefaultReadObject方法。换言之,利用自定义的writeObject方法和readObject方法,用户可以自己控制序列化和反序列化的过程。

复杂序列化情况总结

1、当父类继承Serializable接口时,所有子类都可以被序列化
2、子类实现了Serializable接口,父类没有,父类中的属性不能序列化(不报错,数据丢失),但是在子类中属性仍能正确序列化
3、如果序列化的属性是对象,则这个对象也必须实现Serializable接口,否则会报错
4、反序列化时,如果对象的属性有修改或删减,则修改的部分属性会丢失,但不会报错
5、反序列化时,如果serialVersionUID被修改,则反序列化时会失败

================================================================================
感谢阅读,写得不好的地方请指教,能帮助到你是对我最好的回报,不卑不亢,加油。
请你记住比你优秀的一定比你努力,比你努力的人一定比你优秀。
================================================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值