2014-10-18 170 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().