2015-07-12 2 views
2

Я новичок в Java (и программировании), и должен быть простой ответ на этот вопрос, но я не смог его найти. Я хочу написать код, который будет печатать значение ссылочного имени переменной экземпляра. Например:Как вернуть имя экземпляра класса в Java

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

    Person Person1 = new Person(); 
} 

Я хотел бы написать строку кода, который будет производить что-то на мотив

«The атрибут из Person1 является ...»

что-то к мелодия System.out.println ("The атрибут из Person1" + (????) + "есть ....")

Я не смог найти или создайте метод, который возвращает имя Person1.

+0

Вы говорите о геттерах и сеттерах? – ganeshvjy

+0

Я думаю, что OP хочет распечатать имя переменной * 'Person1'. – sstan

+1

что нужно? – JavaHopper

ответ

2

Это вообще не возможно сделать именно то, что вы хотите. Я не думаю, что имена переменных даже компилируются в классы.

Это можно сделать с помощью аннотаций компиляции, но это не тривиально.

+0

Тогда, вероятно, проще создать конструктор аргументов со строковым аргументом «имя» и напечатать это. Но, спасибо, я подозревал, что это было непросто, потому что я не мог найти прямой ответ нигде. – 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 является: Jeff

+0

Я получаю его, но в этом случае мне пришлось бы использовать конструктор аргументов и повторять имя, когда я создам экземпляр для человека. – AEStudent51345

+0

Имя переменной не хранится нигде. Его даже не нужно хранить в байтовом коде. Подумайте об этом как о держателе, а не о предмете. «__My lefthand__ содержит __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.

Это очень полезно знать, поскольку 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() и вызовите Object one, он напечатает адрес памяти, на котором находится объект. –

+0

Я знаю, потому что я пробовал печатать с «этим», и я получил что-то вроде Person @ 13gh45 – AEStudent51345

Смежные вопросы