FQA 之java 基础
1.修改 java 中getter 返回的Integer 对象变量会修改对象中对应的Integer 变量吗?
public class Test{ private Integer i; public Integer getI(){ return i; } public static void main(String[] args){ Test t=new Test(); Integer other_i=t.getI(); other_i=10; System.out.println(t.getI()); } }
结果打印出来的是null.个人感觉应该是返回10,而不是之前i 的值.
感觉很奇怪,难道getI() 返回的不是引用变量i 的值吗?而引用变量i 的值就是一个Integer 对象的指引.
这样other_i 和i 都指向同一个对象,所以修改other_i 也可以修改到i 指向的对象才对啊.
那为什么结果输出却不是呢?和Integer 是包装类有关吗?
查询资料得知,原来Integer 包装类对象是不可变的,和String 类型类似.所以这个就是原因.
参考:<核心>P188,5.4 节对象包装器与自动包装
2.为什么修改覆盖了equals()方法,就需要重定义hashCode() 方法呢?
java 设计的原则之一:两个对象如果相等(通过equals() 判断) 则他们的hashCode() 返回的hash code 也必须相等.
注意:hash code 相等的对象不一定相等.
有个更加直观的例子:参考<head first java> P560
hashSet 在添加对象时,先判断对象的hash code 在hashSet 中存不存在,如果不存在,则认为没有相同的对象存在,再根据hash code 的值将对象添加到相应的位置.
如果存在相同的hash code ,则通过hash code 定位所有具有相同hash code 值的对象,再判断equals 是否相等,如果再次相等则认为对象已存在,不再加入hashSet 中.
问题是:为什么java 这样设计呢?对象相等则必须有equals 和hashCode 相等呢?
或许是:采用了hash table结构来快速存取数据,所以用到需要hash code.
3.如果一个类继承的父类和接口都有一个相同的方法,则在类中实现的方法是继承?实现接口?还是不需要实现?
4.静态方法在读写不同的文件时会有线程安全的问题吗
5.泛型 public void save(Object<? extends Object> obj);或者 public <T extends Object> void save( Object<T> obj); 这两个方法是一样的.只是表示的方式不一样.
问题是为什么都报这样的错误? 这个方法会报错:The type Object is not generic; it cannot be parameterized with arguments <? extends Object>
这种形式的泛型使用方法只能用在集合上? public <T extends Object> void save( List<T> list); 这个方法是正确的.