当前位置: 首页 > 面试题库 >

Java中的“ this”变量实际上如何设置为当前对象?

蒲寂离
2023-03-14
问题内容

考虑:

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设置为100 TestParent。

  3. 所以不管什么this是,this.i在一个TestParent方法将总是i在变量TestParent类。

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

而且,我的主要问题是

this变量如何设置为调用该方法的当前对象?实际如何实施?


问题答案:

本质上,两者之间没有区别

this.foo()

anyObject.foo()

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

foo(callingObject)

换句话说:每当您使用某个对象引用来调用方法时…最后,就不会对某个对象进行调用。因为深入汇编程序和机器代码,所以不存在诸如“对某事的呼叫”之类的东西。

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

顺便说一句:您实际上可以用Java将其记录下来,例如:

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

以后使用

new Bar().foo();

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

编辑-仅作记录。如果您对foo(Bar this)的更多详细信息感兴趣-您可以转到这个问题;在后面的Java规范中提供详细信息!



 类似资料:
  • 本文向大家介绍将容量设置为C#中SortedList对象中元素的实际数量?,包括了将容量设置为C#中SortedList对象中元素的实际数量?的使用技巧和注意事项,需要的朋友参考一下 要将容量设置为SortedList对象中元素的实际数量,代码如下- 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-

  • 本文向大家介绍C#中如何将容量设置为ArrayList中元素的实际数量,包括了C#中如何将容量设置为ArrayList中元素的实际数量的使用技巧和注意事项,需要的朋友参考一下 要将容量设置为ArrayList中元素的实际数量,代码如下- 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-

  • 问题内容: 我有一些我无法理解的代码,我试图使用回调返回对象数组,我有一个函数返回值,然后将其压入数组,但是我无法在函数外部访问它,我在这里做一些愚蠢的事情,但无法分辨(我对Node.JS非常陌生) 问题答案: 您在这里遇到了多个问题。核心问题是要了解异步响应如何工作以及何时执行哪些代码。但是,除此之外,您还必须学习如何在循环中管理多个异步响应,以及如何知道何时完成所有响应以及如何按顺序获取结果以

  • 我将一个字符串设置为activeElement.value,一切正常。现在,我想为activeElement.value设置一个变量,我得到了以下错误代码: 线程“main”中的异常 org.openqa.selenium.WebDriver异常:未定义患者 ID 命令持续时间或超时:66 毫秒 构建信息:版本:“2.45.0”,修订版:“5017cb8”,时间:“2015-02-26 23:59

  • 问题内容: 我正在使用WAMP。我想从命令提示符下使用php。为此,PATH env变量中的条目是什么? 问题答案: 你需要把具有目录在您安装到您。通常是这样的

  • 我得到了这个转义的JSON 我需要使用Jackson将其转换为Java对象。 然后我创建了一个方法来转换它 Data类中设置为public的变量,那么调用getter时,我将获得。Data类中设置为private的变量,那么调用getter时将得到。 getter和setter总是公共的。