You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何获取调用方法的对象名称?

问题分析

你遇到的核心问题是:Java虚拟机不会保存对象引用变量的名称(比如代码里的obj1)。当你打印this时,实际上调用的是Object类的默认toString()方法,输出格式为类名@十六进制哈希码,这就是你看到ProgLang@2f92e0f4的原因。getName()是Class类的方法,用来获取类名,不能直接替换this,所以会报错。

解决方案

要实现打印"对象名称"的需求,你需要手动给对象添加存储名称的逻辑,因为JVM不会帮你记录这个信息。下面提供两种可行的方式:

方法1:给类新增名称字段,构造时传入

修改ProgLang类,新增一个字段存储你想显示的对象名称,创建对象时传入该名称:

class ProgLang {
    String language;
    String objectName; // 用于存储对象的"名称"

    // 构造器同时接收语言和对象名称参数
    ProgLang(String lang, String objName) {
        this.language = lang;
        this.objectName = objName;
    }

    void getField() {
        System.out.println("Programming Language of " + this.objectName + " : " + this.language);
    }
}

public class ConstructorOverLoading {
    public static void main(String[] args) {
        // 创建对象时传入引用名作为对象名称
        ProgLang obj1 = new ProgLang("Python", "obj1");
        obj1.getField();
    }
}

运行后输出:

Programming Language of obj1 : Python

方法2:调用方法时传入对象名称

如果不想修改类的结构,可以在调用getField()时把引用名作为参数传进去:

class ProgLang {
    String language;

    ProgLang(String lang) {
        this.language = lang;
    }

    // 修改方法,新增对象名称参数
    void getField(String objName) {
        System.out.println("Programming Language of " + objName + " : " + this.language);
    }
}

public class ConstructorOverLoading {
    public static void main(String[] args) {
        ProgLang obj1 = new ProgLang("Python");
        // 调用方法时传入引用名
        obj1.getField("obj1");
    }
}

运行后同样能得到预期输出。

补充说明
  • 引用变量名只是代码层面的标识符,和对象本身没有绑定关系。比如你可以把obj1重新赋值给另一个变量obj2,此时对象本身没有变化,但引用名变了,JVM不会追踪这种变化。
  • 如果只是想让toString()输出更友好,可以重写ProgLang类的toString()方法,但这也只能输出对象的属性,没法直接获取引用名。

内容的提问来源于stack exchange,提问作者prateek khanal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:07:37