有两个小问题哈。

第一,关于函数为List时的情况,为什么在函数内List的size不为0,而在调用函数里,则为0呢?
不太明白List参数传递时的问题。。。

package com;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;

public class TestMain {

/**
 * main()
 * 2010-3-25,下午10:00:10
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    List list = new ArrayList();
    test(list);
    System.out.println(list.size());

}
public static void test(List list){
    Session session = HibernateSessionFactory.getSession();
    session.beginTransaction();
    list = session.createSQLQuery(" select id,name from body " ).list();
    System.out.println("==="+list.size());
    session.close();
}

}

第二,JDK源文件中AbstractMap 的方法 public Set keySet(),没太明白代码结构。。。。。
public Set keySet() {
if (keySet == null) {
keySet = new AbstractSet() {
public Iterator iterator() {
return new Iterator() {
private Iterator> i = entrySet().iterator();

        public boolean hasNext() {
            return i.hasNext();
        }

        public K next() {
            return i.next().getKey();
        }

        public void remove() {
            i.remove();
        }
                };
    }

    public int size() {
        return AbstractMap.this.size();
    }

    public boolean contains(Object k) {
        return AbstractMap.this.containsKey(k);
    }
    };
}

谢谢。

[code="java"]public static void test(List list){
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
list = session.createSQLQuery(" select id,name from body " ).list();
System.out.println("==="+list.size());
session.close();
} [/code]
看看这个方法,根据上面文章讲解的。
[color=red][size=medium]我们知道,方法永远传值(这种值有两种:一种是基本类型,一种是引用【或称地址】);[/size][/color]

跟着我来分析一下:
1,你传list引用给这个test方法,也就是把这个引用复制一份([color=blue][size=medium]于是有两份引用[/size][/color])给test这个函数的"[color=red]参数list[/color]"(这个是[color=red]参数list[/color]哦,跟前面list不同的)。

2,“list=..."是不是修改"[color=red]参数list[/color]"这个引用的值???是的。没错的,但是你发现了,它只修改"[color=red]参数list[/color]"这一份引用,没有修改另一份引用哦。所以原来的那一份list引用没有改变。

应该清楚了吧。

public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList();
test(list); //首先,你要明白java对象传参是传引用,
System.out.println(list.size());

}
public static void test(List list){
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
list = session.createSQLQuery(" select id,name from body " ).list();
//这里的list是拷贝了main方法那个list变量的引用,而让这个拷贝的引用指向新生成的list,原来的引用并没有改变,还是指向 new ArrayList();
System.out.println("==="+list.size());
session.close();
}

图解:

main方法中的list 指向——> new ArrayList();

当调用test(list);时,test中的list 也指向 ——>new ArrayList();
注意test中的list 只是和main方法中的list 指向同一个对象而已,

当执行list = session.createSQLQuery(" select id,name from body " ).list(); 的时候,test中的list 指向新生成的list,而main方法中的list还是指向原来的

if (keySet == null) { //如果AbstractMap 中的keySet属性为null,就创建一个匿名类实现AbstractSet的
keySet = new AbstractSet

[quote]我们应该明白JAVA中的参数传递全是以值传递的。

是基本类型,就拷贝一个基本类型传进方法;

是引用,就拷贝一个引用变量传进去方法,[/quote]

看看这篇文章,将的太好了。
http://blog.csdn.net/baobeiSimple/archive/2007/08/05/1727053.aspx

实现了匿名内部类,
而这个类是个抽象的类,

[size=medium][color=red]我们知道抽象的类是不能直接实例化,如果要实例化,必须先实现(后者继承它的抽象方法)。[/color][/size]

所以,在这里,他想直接用这个抽象类的实例,所以他就实现了这个抽象类的方法。