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());
        
    }
}
View Code

 结果打印出来的是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); 这个方法是正确的.

 

posted @ 2015-08-15 00:01  predisw  阅读(183)  评论(0编辑  收藏  举报