1700438976
1700438977
以上代码中,定义了一个PI字符串类型的常量,又定义了一个abs方法,与静态导入的相同。首先说好消息:编译器没有报错,接下来是不好的消息了:我们不知道哪个属性和哪个方法被调用了,因为常量名和方法名相同,到底调用了哪一个方法呢?我们运行一下看看结果:
1700438978
1700438979
PI=祖冲之
1700438980
1700438981
abs(100)=0
1700438982
1700438983
很明显是本地的属性和方法被引用了,为什么不是Math类中的属性和方法呢?那是因为编译器有一个“最短路径”原则:如果能够在本类中查找到的变量、常量、方法,就不会到其他包或父类、接口中查找,以确保本类中的属性、方法优先。
1700438984
1700438985
因此,如果要变更一个被静态导入的方法,最好的办法是在原始类中重构,而不是在本类中覆盖。
1700438986
1700438987
1700438988
1700438989
1700438991
编写高质量代码:改善Java程序的151个建议 建议11:养成良好习惯,显式声明UID
1700438992
1700438993
我们编写一个实现了Serializable接口(序列化标志接口)的类,Eclipse马上就会给一个黄色警告:需要增加一个Serial Version ID。为什么要增加?它是怎么计算出来的?有什么用?本章就来解释该问题。
1700438994
1700438995
类实现Serializable接口的目的是为了可持久化,比如网络传输或本地存储,为系统的分布和异构部署提供先决支持条件。若没有序列化,现在我们熟悉的远程调用、对象数据库都不可能存在,我们来看一个简单的序列化类:
1700438996
1700438997
public class Person implements Serializable{
1700438998
1700438999
private String name;
1700439000
1700439001
/*name属性的getter/setter方法省略*/
1700439002
1700439003
}
1700439004
1700439005
这是一个简单JavaBean,实现了Serializable接口,可以在网络上传输,也可以本地存储然后读取。这里我们以Java消息服务(Java Message Service)方式传递该对象(即通过网络传递一个对象),定义在消息队列中的数据类型为ObjectMessage,首先定义一个消息的生产者(Producer),代码如下:
1700439006
1700439007
public class Producer{
1700439008
1700439009
public static void main(String[]args)throws Exception{
1700439010
1700439011
Person person=new Person();
1700439012
1700439013
person.setName(“混世魔王”);
1700439014
1700439015
//序列化,保存到磁盘上
1700439016
1700439017
SerializationUtils.writeObject(person);
1700439018
1700439019
}
1700439020
1700439021
}
1700439022
1700439023
这里引入了一个工具类SerializationUtils,其作用是对一个类进行序列化和反序列化,并存储到硬盘上(模拟网络传输),其代码如下:
1700439024
1700439025
public class SerializationUtils{
[
上一页 ]
[ :1.700438976e+09 ]
[
下一页 ]