2015-07-12 85 views
2

我是Java(和编程)的初学者,应该有一个简单的答案,但我找不到它。我想编写一个代码来打印实例变量的引用名称的值。例如:如何在Java中返回一个类的实例的名称

Public class Person { 
    Person() { 
     //attributes, height, weight, etc. 
    } 

    Person Person1 = new Person(); 
} 

我想编写一行代码,将产生的东西

的调“的属性PERSON1的是......”

一些东西到的System.out.println的曲调(以下简称 “属性PERSON1的” +(????)+ “是......”)

我无法找到或创建一个返回名称Person1的方法。

+0

你说的是吸气剂和吸附剂吗? – ganeshvjy

+0

我想OP想打印出*变量名*'Person1'。 – sstan

+1

需要什么? – JavaHopper

回答

2

它一般是不可能做到正是你想要的。我不认为变量名甚至编译到类中。

它可以用编译时注释来完成,但它不是微不足道的。

+0

然后,用一个字符串参数“name”创建一个参数构造函数并打印它可能会更容易。但是,谢谢,我怀疑这并不简单,因为我无法在任何地方找到直截了当的答案。 – AEStudent51345

+0

你是对的,它更容易。就这样你知道 - 编译时间注释让你在编译变量名之前访问代码,所以这是可能的,而且你在某种日志记录场景中可能会有用,但最好是“命名”对象。这里有一个关于编译时注释的教程,如果你很好奇:http://www.javalobby.org/java/forums/t17876.html –

3

“Person1”不是实例的名称,而是保存对实例的引用的变量的名称。实例本身没有名字。如果你想保留它,你将不得不给它一个名字的属性。

public class Person { 
    private final String name; 
    public Person(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 

那么你可以做:

Person person1 = new Person("Jeff"); 

System.out.println("Person1's name is: " + person1.getName()); 

的输出将是:

PERSON1的名字是:杰夫

+0

我明白了,但在这种情况下,我将不得不使用参数构造函数,并在人员上创建实例时重复该名称。 – AEStudent51345

+0

变量名称不存储在任何地方。它甚至不需要存储在字节码中。把它看作是一个持有者,而不是对象。 “__我左手拿着一个__cup__,__cup__的名字是什么?” – Daniel

0

为了能够做到这一点,你应该重写ToString()函数 像这样的事情

/* Returns the string representation of your class object .*/ 
    @Override 
     public String toString() { 
      return "The attributes of this person are :height - " + height + " weight - " + weight + // you are print out all your properties. 
     } 

现在whenver要打印的对象,你可以做

System.out.println(person1); 
0

我不知道你对编程语言有多熟悉。我看到你说你是Java的新手,所以我会从那里开始。与许多面向对象的语言一样,Java在创建类时使用继承。在Java中,当你定义一个类时,你可以使用“extends”关键字来子类,并使用或覆盖父类中的任何方法。现在,在Java中,ALL类自动从这个称为Object的类继承。

这是非常有用的知道,因为对象包含一些有用的方法,其中最引人注目的是“toString()”。你不需要使用扩展来获得这些方法顺便说一句。现在,toString本身并没有用,但你可以覆盖它打印出你想要的东西。

public class Person 
{ 
    String name; 
    int age; 

    Person(String name, int age) 
    { 
     this.name = name; 
     this.age = age; 
    } 

    @Override 
    public String toString() 
    { 
     return "Name is: " + name + "and age is: " + age"; 
    } 
} 

请注意我在那里定义的toString()方法?每当你在一个对象上调用这个方法,你就会得到这个字符串打印出来。因此,例如,在你的榜样:

Person person1 = new Person("Ford Prefect", 42); 

System.out.println(person1.toString()); //Will print what we defined in toString. 

你甚至都不需要的ToString(),只是PERSON1因为JVM将实现你的意思是使用的toString。如果您使用IntelliJ IDE,则可以执行Alt + Insert并选择toString()来覆盖它。 IDE是帮助您提高效率的绝佳工具。祝你好运!

+0

原来,不是很。但我明白你在说什么;我只是想知道变量“Person1”的名称是否存储在任何地方,以便它可以在运行时访问;它似乎没有。 – AEStudent51345

+0

编译器实际上删除了很多信息,因为JVM(运行编译的Java字节码的东西)并不真的需要它。 Person1作为参考来帮助您在代码中引用它,但在运行时没有任何意义。 Person1本质上是对存储地址的引用,该地址存储您创建的特定Person对象(对新的调用返回它)。事实上,如果你删除你自己的.toString()并调用对象,它将打印对象所在的内存地址。 –

+0

我知道,因为我尝试使用“this”进行打印,并且我得到了Person @ 13gh45 – AEStudent51345