gpt4 book ai didi

java - Java中的 'this'变量实际上是如何设置为当前对象的?

转载 作者:IT老高 更新时间:2023-10-28 21:05:20 26 4
gpt4 key购买 nike

考虑:

class TestParent{
public int i = 100;
public void printName(){
System.err.println(this); //{TestChild@428} according to the Debugger.
System.err.println(this.i); //this.i is 100.
}
}

class TestChild extends TestParent{
public int i = 200;
}

public class ThisTest {
public static void main(String[] args) {
new TestChild().printName();
}
}

我知道有人问过类似的问题,但我无法深入了解 Java 中的“this”变量。

让我试着解释一下我是如何理解上图的结果的。

  1. 既然是 new TestChild()调用 printName() 的对象方法,this第 6 行中的变量设置为 TestChild对象 - {TestChild@428} 根据调试器。

  2. 但是,由于 Java 没有虚拟字段 - 我不完全确定这意味着什么,但我从概念上理解它与支持多态性的 Java 方法相反 - this.i设置为 TestParent 的 100在编译时。

  3. 所以无论如何this是,this.iTestParent方法永远是 i TestParent 中的变量类。

我不确定我的理解是否正确,如果我错了,请纠正我。

另外,我的主要问题是,

this 怎么样?变量设置为调用该方法的当前对象?实际是如何实现的?

最佳答案

本质上没有区别

this.foo()

anyObject.foo()

因为 两者 以相同的方式“实现”。请记住,“最终”“面向对象只是一个抽象,而在“现实”中发生的事情是这样的:

foo(callingObject)

换句话说:每当你使用一些对象引用来调用一个方法......最终没有调用 on 一些对象。因为在汇编程序和机器代码的深处,不存在诸如“调用某事”之类的东西。

真正发生的是对函数的调用;第一个(在源代码级别隐式/不可见)参数是该对象。

顺便说一句:您实际上可以像这样用 Java 写下来:

class Bar {
void foo(Bar this) { ... }

以后使用

new Bar().foo();

对于this.fieldA,最后:你引用了内存中的某个位置;和一个表格,告诉您您将在哪个“偏移量”上找到 fieldA。

编辑 - 仅作记录。如果您对 foo(Bar this) 的更多详细信息感兴趣 - 您可以转到此 question ;在其背后的 Java 规范中给出详细信息!

关于java - Java中的 'this'变量实际上是如何设置为当前对象的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39531503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com