Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何打印包含对象的变量名?_Java - Fatal编程技术网

Java 如何打印包含对象的变量名?

Java 如何打印包含对象的变量名?,java,Java,如何打印保存对象的变量名 例如,我有: myclass ob=new myclass() 如何打印“ob”?System.out.println()是用于打印到控制台的命令 因此,如果您有自己创建和实例化的类,您可以: MyObject obj = new MyObject(); System.out.println(obj); 这将打印出MyObject的toString()实现。默认实现不是很有趣,因此要获得有用的信息,您必须重写toString()以打印对象类型名称: System.o

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

例如,我有:

myclass ob=new myclass()
如何打印“ob”?

System.out.println()
是用于打印到控制台的命令

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

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

这将打印出
MyObject
toString()
实现。默认实现不是很有趣,因此要获得有用的信息,您必须重写
toString()

以打印对象类型名称:

System.out.println(myObject.getClass().getName());
对象没有名称,除非您使用的类允许为每个对象指定一个名称(例如,通过使用
getName()
检索的变量)

特别是,用于引用对象的任何特定变量的名称对于对象本身来说都是完全未知的。所以你不能这样做:

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

(请记住,几个变量都可以引用同一个对象,并且不必有任何命名变量引用一个对象。)

我假设您想要一种“打印”对象的方法,在这种情况下,您首先要覆盖对象的
toString()
方法。这将允许您指定调用
toString()时您类型的对象返回的内容。

然后,您可以简单地执行
System.out.println(MyObject)

这将隐式调用MyObject的
toString()

稍微完整一些(但本质上与上面相同):

  • 如果您有一个对象:
    object.getClass().getName()
    将为您提供对象的完全限定名(即package.className。例如,String thing=new String();thing.getClass().getName()将返回“java.lang.String”。
  • 如果您有类名:
    className.class.getName()
    将为您提供对象的完全限定名(即package.className。例如.String.class.getName()将返回“java.lang.String”。
  • 可以随时打印。可以使用System.out.println()。 变量名是编译时信息,通常在编译后不会存储。如果使用调试信息编译,则会存储变量名。
    在大多数情况下,想要打印变量名是一个荒谬的请求,但如果确实需要,请阅读java调试信息。

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

    //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());
    

    您无法获取对象引用的名称。相反,您可以获取其哈希代码或计数器。 我解决这个问题的方法如下:

    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
    对象名称2
    
    这实现了所需的结果,但这有点假,因为如果toString()返回的字符串要实际反映变量的名称(当然,这只有您自己知道,因为编码人员会知道),您必须使用该方法使用的约定,即在该实现中,因为返回的字符串的格式为ClassName+counter,因此您必须使用该格式命名变量:myClass1、myClass2等。如果您以其他方式命名变量(例如ClassName+A/B/C等或某种随机变量名)虽然返回字符串将保持由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);
        }
    
    }
    

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

    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);
    
    import java.lang.reflect.*;
    公共类myclass{
    私家医生;
    公共静态void main(字符串参数[]){
    字段fd[]=myclass.class.getDeclaredFields();
    对于(int i=0;i
    我知道太晚了),但这里有一个类似于
    getSimpleName()的方法

    在这种情况下:

    myclass ob=new myclass()
    System.out.println(ob.getClass().getSimpleName())
    

    系统输出:ob

    @bipin,这是作业吗?你试过什么?你说的“我的对象名”是什么意思?嗨,布拉德,我想知道,我们能在程序中打印对象名吗?这个问题绝对让人困惑。我不太清楚为什么Jon Skeet会在这里打勾。当然,我不完全确定这个问题//我想在我的控制台中打印“ob”。这是引用该对象的变量的名称。hello friend,System.out.println()将只打印该对象的哈希代码,而不是对象名称。hello friend,这就是为什么我说您需要重写toString:)问题:“我如何重写toString?”回答:“您需要重写toString。”嗨friend,所有这些都将打印类的名称,而不是对象名称。@Bipin:No。。。我说,这是不支持的,因为对象本身没有名称。这就是类名。我认为这不是他所期望的。我认为乔恩·斯基特是对的。这仍然不能回答问题。那是错误的。返回源代码中给定的基础类的简单名称。
    myclass ob=new myclass()
    System.out.println(ob.getClass().getSimpleName())