平常也没有怎么注意这方面的问题。
只是觉得对象是按引用传递,基本数据类型和String 是按值传递。
但是为什么返回值为 ArrayList 的测试和返回对象的不同呢这么问是不是有点拗口
上代码吧。public class ReturnTypeTest {
private Human human = null;
private List<String> testList = null;
public void init(){
testList = new ArrayList<String>();
testList.add("555");
human = new Human();
human.setName("Lu");
}
public static void main(String[] args) {
ReturnTypeTest test = new ReturnTypeTest();
test.init();
System.out.println(test.getTestList().size());
List<String> ss = test.getTestList();
System.out.println(ss.size());
ss = null;
System.out.println(ss);
System.out.println(test.getTestList());
Human h = test.getHuman();
System.out.println(h.getName());
h.setName("LuLu");
System.out.println(h.getName());
System.out.println(test.getHuman().getName());
}
public List<String> getTestList() {
return testList;
}
public void setTestList(List<String> testList) {
this.testList = testList;
} public Human getHuman() {
return human;
} public void setHuman(Human human) {
this.human = human;
}
}
现在有点迷糊了。
哪位路过的帅哥美女给顺便给讲解一下吧。
只是觉得对象是按引用传递,基本数据类型和String 是按值传递。
但是为什么返回值为 ArrayList 的测试和返回对象的不同呢这么问是不是有点拗口
上代码吧。public class ReturnTypeTest {
private Human human = null;
private List<String> testList = null;
public void init(){
testList = new ArrayList<String>();
testList.add("555");
human = new Human();
human.setName("Lu");
}
public static void main(String[] args) {
ReturnTypeTest test = new ReturnTypeTest();
test.init();
System.out.println(test.getTestList().size());
List<String> ss = test.getTestList();
System.out.println(ss.size());
ss = null;
System.out.println(ss);
System.out.println(test.getTestList());
Human h = test.getHuman();
System.out.println(h.getName());
h.setName("LuLu");
System.out.println(h.getName());
System.out.println(test.getHuman().getName());
}
public List<String> getTestList() {
return testList;
}
public void setTestList(List<String> testList) {
this.testList = testList;
} public Human getHuman() {
return human;
} public void setHuman(Human human) {
this.human = human;
}
}
现在有点迷糊了。
哪位路过的帅哥美女给顺便给讲解一下吧。
解决方案 »
- 有人用过OSGI吗,如何用OSGI把jar包集成到项目中,实现可插拔
- 在eclipse中运行,没出现错误,然而在cmd.exe中运行却出现下列错误
- 有个综合的问题急须解决,是关于JAVA基础知识的,请高手来帮我解决,我在线等待
- jdbc
- java内核漏洞
- Swill的问题,为什么我点击按钮后,JTree没有创建相应结点呢?
- swing 画线问题~~~ 求助~~
- 如何修改jar包的class文件。或者覆盖也可。在线等。。。。。
- swing 包怎么回事呀???
- JBuilder 5 查询数据库的问题
- HttpURLConnection怎么在上传文件的同时把文件的信息也提交到服务器?
- 如何通过内部类隐藏外部的窗口?
System.out.println(test.getHuman().getName());你是想说这两段代码打印的东西吗?首先test.getTestList()的值并没有边,因为你没有改变它里面的值,test.getHuman().getName(),这个你先是得到这个对象,然后再对这个对象进行修改,再下面调用的时候就是你修改过后的值了
h.setName("LuLu");
之后,
h.name 和 test.human.name 能一同改变。而
List<String> ss = test.getTestList();
ss = null;
之后
test.testList没有跟着变为空
哦,在 ss.add("something") 后,是会一同改变。
ss == null 为什么不能一同改变呢?
ss =null;只是释放了这个内存地址的一个引用
你把一个引用SS 设为空 和内存地址里面的值没关系呀
那ss = test.getTestList(); 得到的是对象的引用了?
ss = null; 这句话又是怎么执行的?
这是把这个ss对其对象的引用释放了,就是不再对其进行引用了,而不会改变对象本身ss = test.getTestList();之后
ss----> 对象1
test.getTestList()---->对象1ss = null;之后是
ss---->null
test.getTestList()---->对象1
首先,说第一个问题,执行Human h = test.getHuman();后h和test.human是同一个对象的引用,所以一个的改变必然会导致另一个的改变。
下面说说,第二个问题,执行List<String> ss = test.getTestList();后ss和test.testList是同一个对象的引用,执行ss = null;后ss就指向空,但是这个没有影响test.testList,test.testList还是指向那个对象。
然后执行清理时,内存里原来 test.testList 指向的值会被回收。如果是这么个流程的话,那就总算明白了。