如何打印存储对象的变量名?

15

如何打印保存对象的变量名?

例如,我有以下代码:

myclass ob=new myclass()

如何打印出 "ob"?


3
@bipin,这是作业吗?你尝试过什么? - Brad
4
“my object name”是什么意思? - jmj
1
嗨Brad,我想知道,在我们的程序中,我们能否打印对象名称。 - Bipin Sahoo
1
这个问题非常令人困惑。我不太确定为什么Jon Skeet在这里得到了复选框。当然,我也不完全确定这个问题是什么。 - Erick Robertson
1
嗨朋友,使用这个方法我们可以打印类名,那么为什么还需要 object.getClass().getName() 呢?请告诉我,是否可以编程实现打印对象名称。 - Bipin Sahoo
显示剩余6条评论
11个回答

21

除非您使用允许每个对象都可以被赋予一个名称的类(例如通过使用getName()检索的变量),否则对象是没有名称的。

特别地,用于引用对象的任何特定变量的名称对该对象本身是完全未知的。因此,您不能执行以下操作:

Object foo = new Object();
// There's no support for this
String name = foo.getName(); // expecting to get "foo"

(请注意,多个变量可能都指向同一个对象,并且不必有任何命名变量引用对象。)


4
@Bipin:不是的...我的意思是没有支持那个功能,因为对象本质上并没有“名字”。 - Jon Skeet

4

打印对象类型名称:

System.out.println(myObject.getClass().getName());

8
那将是课程的名称。我认为这不是他所期望的。我认为Jon Skeet说得对。 - Joeri Hendrickx

3

解决方法。如果您需要对象名称,则可以在构造函数中进行初始化。

//in class myClass

private String objName;

myClass(String objN)
{
    this.objName = objN;
..
}
public String getObjName() {
    return objName;
}
//in main()
.
.
.
myclass ob = new myclass("ob"); //any other variables accessing this object 
                              //eg. temOb = ob get the same object name "ob"
System.out.println("object name is: " + ob.getObjName());
myclass ob1 = new myclass("ob1");
System.out.println("object name is: " + ob1.getObjName());

2

System.out.println(); 是用于在控制台打印输出的命令。

因此,如果您有自己创建和实例化的类,您可以执行以下操作:

MyObject obj = new MyObject();
System.out.println(obj);

这将打印出MyObjecttoString()实现。默认的实现不是很有趣,因此要获取有用的信息,您需要覆盖toString()


2
你好朋友,System.out.println() 只会打印该对象的哈希码,而不是对象名称。 - Bipin Sahoo
6
你好朋友,这就是为什么我说你需要重写toString()方法 :) - willcodejavaforfood
2
问题: "如何覆盖toString?" 答案: "你需要覆盖toString。" - user3932000

2
稍微完整一些(但基本与上面相同):
  1. 如果你有一个对象:object.getClass().getName()会给你这个对象的完全限定名(即包.类名)。例如,String thing = new String(); thing.getClass().getName()将返回"java.lang.String"。
  2. 如果你有一个类名:className.class.getName()会给你这个类的完全限定名(即包.类名)。例如,String.class.getName()将返回"java.lang.String"。
无论如何打印它都可以。也许使用System.out.println()。
变量的名称是编译时信息,在编译后通常不会存储。如果您使用调试信息进行编译,则会存储变量名称。
在许多情况下,想要打印变量的名称是一个荒谬的请求,但如果您真的需要这样做,请阅读Java调试信息的相关内容。

1
嗨朋友,所有这些都将打印类名,而不是对象名。 - Bipin Sahoo

1
尝试反射+哈希码。例如:

String hashcode = ob.hashCode();
String obName;
java.lang.reflect.Field[] fields = 
ob.getClass().getDeclaredFields();

for( final  java.lang.reflect.Field field : fields )
{
  if( field.hashCode().equals(hashcode) )
  {
    obName = field.getName();
    break;
  }
}
System.out.println(obName);

0

这样做可以达到所需的结果,但有点欺骗性。因为如果 toString() 返回的字符串实际上反映了您的变量名称(当然,只有您作为编码人员知道),您必须使用该方法使用的约定,即在此实现中,由于返回的字符串格式为 ClassName+counter,您必须使用该格式命名您的变量:myClass1、myClass2 等。如果您以其他方式命名变量(例如 className+A/B/C 等或 someRandomVariableName),尽管返回的字符串仍按照 toString() 方法实现返回 myClass1、myClass2 等,但它不会反映您实际在代码中使用的变量名称。

class myClass {

    private static int counter = 1;
    private String string;
    private int objCounter;

    myClass(String string) {
        this.string = new String(string);
        objCounter = counter;
        counter++;
    }

    @Override
    public String toString() {
        return this.getClass().getName() + objCounter + ": " + this.string;
    }

    public static void main(String[] args) {
        myClass myClass1 = new myClass("This is the text for the first object.");
        myClass myClass2 = new myClass("This is the text for the second object.");
        System.out.println(myClass1);
        System.out.println(myClass2);
    }

}

0

您无法获取对象引用的名称。但是可以获取其哈希码或计数器。

我解决了这个问题,方法如下:

class ObjectName
{
    static int num;
    ObjectName()
    {
     num++;
    }

    public int getObjectCount()
    {
        return num;
    }
    public static void main(String[] args) {
        ObjectName ob1=new ObjectName();
        System.out.println(ob1.getClass().getName()+" "+ob1.getObjectCount());
        ObjectName ob2=new ObjectName();
        System.out.println(ob1.getClass().getName()+" "+ob1.getObjectCount());
    }
}

输出:

ObjectName 1
ObjectName 2

0
我假设你想要一种“打印”对象的方法,这种情况下,你需要首先重写你的对象的toString()方法。这将允许你指定在调用toString()时,你的类型返回的内容。
然后,你只需要使用System.out.println(MyObject);即可。
这将隐式地调用MyObject的toString()方法。

那仍然没有回答这个问题。 - user3932000

0
import java.lang.reflect.*;

public class myclass {
    private myclass ob;

    public static void main(String args[]) {
            Field fd[] = myclass.class.getDeclaredFields();
            for (int i = 0; i < fd.length; i++) {
                  System.out.println(fd[i].getName());
            }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接