2014-10-18 169 views
0

我在Java中編寫了大約一週的時間,但我仍然在學習它的問題。實例化類的靜態對象

我知道我們可以創建一個類,然後使用類的名稱創建它的實例。

,但我有這樣的代碼這讓我很難理解這裏發生了什麼,

這就是所謂XMLGettersSetters.java文件,

public class XMLGettersSetters { 

    private ArrayList<String> title = new ArrayList<String>(); 
    private ArrayList<String> artist = new ArrayList<String>(); 
    private ArrayList<String> country = new ArrayList<String>(); 
    private ArrayList<String> company = new ArrayList<String>(); 
    private ArrayList<String> price = new ArrayList<String>(); 
    private ArrayList<String> year = new ArrayList<String>(); 

    public ArrayList<String> getCompany() { 
     return company; 
    } 

    public void setCompany(String company) { 
     this.company.add(company); 
     Log.i("This is the company:", company); 
    } 

    public ArrayList<String> getPrice() { 
     return price; 
    } 

    public void setPrice(String price) { 
     this.price.add(price); 
     Log.i("This is the price:", price); 
    } 

    public ArrayList<String> getYear() { 
     return year; 
    } 

    public void setYear(String year) { 
     this.year.add(year); 
     Log.i("This is the year:", year); 
    } 

    public ArrayList<String> getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title.add(title); 
     Log.i("This is the title:", title); 
    } 

    public ArrayList<String> getArtist() { 
     return artist; 
    } 

    public void setArtist(String artist) { 
     this.artist.add(artist); 
     Log.i("This is the artist:", artist); 
    } 

    public ArrayList<String> getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country.add(country); 
     Log.i("This is the country:", country); 
    } 

} 

現在我可以創建這個類這樣的對象,

XMLGettersSetters myObject = new XMLGettersSetters(); 

,但是從那裏我學習這個代碼的網站,他們所創建的對象就是這樣,

public static XMLGettersSetters data = null; 

該對象是如何聲明爲靜態的?上面的代碼甚至意味着什麼。 難道不應該只是,

XMLGettersSetters data = null; 

據我所知,當我們聲明爲靜態的,然後我們需要DONOT實例化一個類中使用靜態變量從該類的變量。

一個問題,

public static XMLGettersSetters getXMLData() { 
    return data; 
} 

我不知道在上面的代碼中發生了什麼, 第一個對象實例化的靜態再而不是給對象的名稱,函數給出,而不是它是getXMLData() 。 而返回類型爲data

現在關於下面的代碼,

public static void setXMLData(XMLGettersSetters data) { 
    XMLHandler.data = data; 
} 

的方法與XMLGettersSetters創建對象作爲參數,但怎麼樣XMLHandler.data? 這是什麼?不應該是this.data

+0

他們沒有創建一個對象:

在Java中,你可以在這裏你聲明變量分配在同一個句子中的價值。他們只是將'null'分配給Java中代表「無對象」的變量。稍後,最終,將創建一個實際的對象並通過setter進行分配。順便說一句,這是一個相當糟糕的設計。 – 5gon12eder 2014-10-18 18:09:56

+0

由於'data'是靜態的,它屬於這個類。建議直接從類訪問靜態變量,而不是實例(這是您在調用'this'時訪問當前實例的過程)。另外,該方法是靜態的,不能在靜態方法中使用'this' – 2014-10-18 18:11:29

回答

2

他們可能創建了對象static,因爲他們希望它是global。例如,在代碼中的任何地方,您都可以撥打XMLHandler.data。 (我在這裏假定在其中創建數據變量是XMLHandler,因爲它是在setter方法使用該類..

如果它僅僅是XMLGettersSetters data = null;,而不是static...那麼它不能從任何地方訪問代碼。

至於用來代替this.data你要知道,按照慣例,大多數人的指定對象之前訪問一個靜態變量時,他們正在訪問的類名XMLHandler.data

0

該對象被實例化,但隨後被放置到一個靜態變量中。這意味着你總是訪問XMLGettersAndSetters的同一個實例。

由於方法是靜態的,所以必須引用靜態變量而不是this.data,它指向當前實例中的變量。

1

靜態是一個字段,而不是一個對象。靜態字段是每個類,由有權訪問此字段的所有代碼共享。當班級首次加載時,它們僅初始化一次。常用字段(不含靜態)是每個對象實例。它們在創建對象實例時被初始化。

int x = 2; 
Object y = new Object().