2015-07-12 77 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

相關問題