
说明:getObject()和get0bject()的问题,一个是大写字母O,一个是数字0,加上@Override可以准确的判断能否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。
这里的签名不是对接接口时候使用的加密算法生成的字符串,而是指的是方法名、入参、返回值这三项。
- //正例
- "test".equals(object);
- //反例
- object.equals("test");
说明:推荐使用JDK7引入的工具类 java.util.Objects#equals(Object a,Object b)方法进行比较。
拓展:为啥呢??我们来看个例子。
- int i= 1;
- int j = 1;
-
- System.out.println(i==j);
-
- int k = 128;
- int l = 128;
-
- System.out.println(k==l);
-
-
- Integer a = 1;
- Integer b = 1;
- System.out.println(a==b);
-
- Integer c = 128;
- Integer d = 128;
-
- System.out.println(c==d);
-
- System.out.println(Objects.equals(c,d));
思考一下,上述的打印结果会是什么?全是true吗?
.
.
.
.
.
.

.
.
.
.
.
公布答案:

为什么会是这样呢?
双等号“==”对于基本类型来说,都是比较的值,非基本类型都是比较的对象的地址,这里 int是基本类型,Integer是int的包装类,也就是非基本类型,比较的是地址。
第一个和第二个是true不必多说。
既然是比较的地址,为什么三个和第四个 就有差异?
这要涉及到Integer的源码。
Integer在加载的时候,有一个静态块,会初始化-128~127之间的int值到一个缓存数组中,当使用Integer定义这之间的值的时候,会直接返回数组中对应的值,地址相同,所以第三个比较为true;当用户定义超出这个范围的值的时候,会直接new Integer(对应的值),返回的是不同的地址,所以第四个比较为false。
静态块:

赋值方法:

好了 继续。