第一,关于函数为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]
所以,在这里,他想直接用这个抽象类的实例,所以他就实现了这个抽象类的方法。