如何在Java中返回一个类的实例的名称
我是Java(和编程)的初学者,应该有一个简单的答案,但我找不到它。我想编写一个代码来打印实例变量的引用名称的值。例如:如何在Java中返回一个类的实例的名称
Public class Person {
Person() {
//attributes, height, weight, etc.
}
Person Person1 = new Person();
}
我想编写一行代码,将产生的东西
的调“的属性PERSON1的是......”
一些东西到的System.out.println的曲调(以下简称 “属性PERSON1的” +(????)+ “是......”)
我无法找到或创建一个返回名称Person1的方法。
它一般是不可能做到正是你想要的。我不认为变量名甚至编译到类中。
它可以用编译时注释来完成,但它不是微不足道的。
然后,用一个字符串参数“name”创建一个参数构造函数并打印它可能会更容易。但是,谢谢,我怀疑这并不简单,因为我无法在任何地方找到直截了当的答案。 – AEStudent51345
你是对的,它更容易。就这样你知道 - 编译时间注释让你在编译变量名之前访问代码,所以这是可能的,而且你在某种日志记录场景中可能会有用,但最好是“命名”对象。这里有一个关于编译时注释的教程,如果你很好奇:http://www.javalobby.org/java/forums/t17876.html –
“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的名字是:杰夫
我明白了,但在这种情况下,我将不得不使用参数构造函数,并在人员上创建实例时重复该名称。 – AEStudent51345
变量名称不存储在任何地方。它甚至不需要存储在字节码中。把它看作是一个持有者,而不是对象。 “__我左手拿着一个__cup__,__cup__的名字是什么?” – Daniel
为了能够做到这一点,你应该重写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);
我不知道你对编程语言有多熟悉。我看到你说你是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是帮助您提高效率的绝佳工具。祝你好运!
原来,不是很。但我明白你在说什么;我只是想知道变量“Person1”的名称是否存储在任何地方,以便它可以在运行时访问;它似乎没有。 – AEStudent51345
编译器实际上删除了很多信息,因为JVM(运行编译的Java字节码的东西)并不真的需要它。 Person1作为参考来帮助您在代码中引用它,但在运行时没有任何意义。 Person1本质上是对存储地址的引用,该地址存储您创建的特定Person对象(对新的调用返回它)。事实上,如果你删除你自己的.toString()并调用对象,它将打印对象所在的内存地址。 –
我知道,因为我尝试使用“this”进行打印,并且我得到了Person @ 13gh45 – AEStudent51345
你说的是吸气剂和吸附剂吗? – ganeshvjy
我想OP想打印出*变量名*'Person1'。 – sstan
需要什么? – JavaHopper