Java:对象指针处理

标签 java pointers reference

假设我有这段 Java 代码(期中复习!):

public class A {
public int key;
}

public class B extends A {
}

public class Problem1 {
public static void f(A x) {
A y = x;
y.key = x.key + 1;
}

public static void f(B x) {
B y = new B();
y.key = x.key + 2;
x = y;
}

public static void main(String[] args) {
A p = new A();
p.key = 3;
B q = new B();
q.key = 10;
f(p);
f(q);
p = q;
f(p);
System.out.println(p.key);
}
}

我不确定我是否正确理解 p = q。到目前为止,我的理解是:因为 B 扩展了 A,所以允许此操作,但它不会使 p 和 q 指向同一个对象。相反,它更新了 p 的键值,但它仍然属于 A 类。这就是为什么 f(p) 最后返回 11。这与我之前对 Java 的了解不符,因此将不胜感激。

例如,如果我有 int a = 4 和 int b = 3,那么我会这样做:

a = b;
b++;
return a;

a 将返回 3,即使它应该指向 b 所指向的同一对象?

请指教。

最佳答案

想一想。 Java原语保存内存字节区域中的实际值: 因此,如果 a = 4b = 3 ,则 8 字节机器内存区域可以像(二进制)一样保存它

a = 0 0 0 0 0 0 1 1 
b = 0 0 0 0 0 0 1 0

现在,当您说 a=b; 时,意味着

a = 0 0 0 0 0 0 1 0 
b = 0 0 0 0 0 0 1 0

然后b++(即b = b+1)

a = 0 0 0 0 0 0 1 0 
b = 0 0 0 0 0 0 1 1

然后

return a;

Then  a = 0 0 0 0 0 0 1 0 (i.e. 3)

希望您能够理解它的原始值。但对于 java 中的对象来说,情况完全不同。

现在想想, a 和 b 不是原始类型,而是具有 int 字段的对象。示例类可能看起来像

class Test {
private int value;

public Test(int value){
 this.value = value;
}

public int getValue(){
return value;
}

public int increment(){
value++;
}
}

然后a = new Test(4); b = new Test(3); 在内存中表示如下:

堆:

a = x63489DF8 ---> [Test(4) Object, value = 4, Heap Memory address = x63489DF8]
b = xDFA78945 ---> [Test(3) Object, value = 3, Heap Memory address = xDFA78945]

(ab 保存指向对象的堆内存地址)

现在,当您说 a=b; 时,意味着

a = xDFA78945 ---> [Test(3) Object value = 3, Heap Memory address = xDFA78945]
b = xDFA78945 ---> [Test(3) Object value = 3, Heap Memory address = xDFA78945]

(内存地址x63489DF8中的对象是垃圾可回收的,并且a,b引用同一个对象)

现在,说b.increment();,然后内存区域xDFA78945中的对象被操作,新对象变成[Test(3) Object value = 4、堆内存地址=xDFA78945]

a = xDFA78945 ---> [Test(3) Object value = 4, Heap Memory address = xDFA78945]
b = xDFA78945 ---> [Test(3) Object value = 4, Heap Memory address = xDFA78945]

(请注意,更改反射(reflect)了两个引用,因为两者实际上都指向同一个对象)

现在返回a.getValue()返回4。 (即通过引用 b 完成的更改也会反射(reflect)在引用 a 中)

关于Java:对象指针处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19238084/

相关文章:

java - 从 URL 下载 Java 文件 1) 您不知道扩展名[例如 .jpg] 或 2) 正在重定向到文件

Java获取第一个元素然后删除第一个元素打印其余元素

java - 日历设置日期导致异常,消息为 "Unparsable date"

c - 数组衰减为指针的异常?

IEnumerable 与 List 上的 C# foreach - 元素修改仅对数组持久 - 为什么?

java - 将表上的现有条目转换为 Hibernate 实体对象

c - 错误: void value not ignored - in simple c program

c++ - 尝试在 std::map 中插入抽象类时没有匹配的调用函数

C++通过引用返回有什么作用?

flash - Actionscript 3 - 引用与值(value)