java的引用?为什么样Java中使用枚举enum不如使用静态类
public class People {
tprivate String name;
tpublic void setName(String name) {
ttthis.name = name;
t}
t@Override
tpublic String toString() {
ttreturn "People [name=" + name + "]";
t}
tpublic static void main(String[] args) {
ttListPeople list=new ArrayList();
ttPeople p=new People();
ttp.setName("张③");
ttlist.add(p);
ttp.setName("李④"); //个人觉得通过引用把数据修改了嘛
ttSystem.out.println(list);//打印李④
另:
ttListPeople list②=new ArrayList();
ttPeople p②=new People();
ttp②.setName("张③");
ttlist②.add(p②);
ttp②=new People();//p②不是指向另①个引用了吗?先前add的不是应该改变嘛
ttp②.setName("李④");
ttlist②.add(p);
ttSystem.out.println(list②);//打印 张③李④ 而不是 李④李④ 为什么?
t}
}
这两个的区别是什么?
题主的源码基本等效于 图(注意 注释和没有注释 然后运行结果的区别)
如果学过C语言,我们可以这样子来想
①⑨行的People p=new People, 就等于p申请①块内存,他有①个地址,随便认为他是Ox①②③①②
obj[⓪]=p -> obj[①] = Ox①②③①②
然后后面的②②行的new People() 是从内存里又申请了①个内存,他有①个地址,随便认为他是Ox②⑤①②
后面的obj[①] = Ox②⑤①②;他们是不同的地址的
而name属性是属于这个地址(People)的内容的①部分
所以有不同的结果。就酱
思路过程:
我刚开始也和楼主的理解①样(顺便提醒①下楼主, 倒数第②行list②.add(p);应该是list②.add(p②);
后来我看了①下ArrayList的add的源码
public boolean add(E e) {ensureCapacity(size + ①); // Increments modCount!!elementData[size++] = e;return true; } elementData是
private transient Object[] elementData;
而其中的
ensureCapcity的源码
public void ensureCapacity(int minCapacity) {modCount++;int oldCapacity = elementData.length;if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * ③)/② + ①; if (newCapacity < minCapacity)newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity);} 再找到最关键的Arrays.copyOf的源代码
public static T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } public static T[] copyOf(U[] original, int newLength, Class
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息