2015-11-04 34 views
-2

有人可以幫助我理解以下語句的含義嗎?瞭解Java中的靜態方法

「其他任何方法一樣,靜態方法可以創建或使用命名其類型的對象,所以靜態方法經常被用來作爲一個‘牧羊人’爲它自己的類型的情況下,一羣

來源:http://www.codeguru.com/java/tij/tij0037.shtml#Heading79

+1

坦率地說,'static'方法可以創建任意類型的任意數量的實例。不知道作者想說什麼。您應該在該網站上詢問此問題 – TheLostMind

+1

理想情況下,您應該在該網站的評論下留下您的問題,因爲我看到有一個框可以這樣做。 –

+1

@JunedAhsan我同意。我不明白爲什麼StackOverflow應被視爲任意Internet垃圾的驗證站點。 – EJP

回答

1

這裏有一個例子:假設你有一個類Person,看起來像這樣:

public class Person { 
    static ArrayList<Person> people = new ArrayList<>(); 
    String name; 
    int age; 

    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
     people.add(this); 
    } 

    public void display() { 
     System.out.println(name + ", age " + age); 
    } 

    public static void displayAll() { 
     for (int i=0; i<people.size(); i++) { 
      people.get(i).display(); 
     } 
    } 
} 

在這個例子中,people屬於Person類本身,因爲它是靜態的,而nameage爲非靜態和屬於的每個Personinstance。同樣,因爲displayAll()是靜態的,所以它只能由Person調用,而非靜態的display()只能由Person的單個實例調用。

爲了說明這一點,說你有這個在你的主類:

Person john = new Person("John", 25); 
Person amy = new Person("Amy", 27); 
System.out.println(john.name + " is " + john.age); 
System.out.println(amy.name + " is " + amy.age); 

這將創造Personjohnamy兩個實例,並會給出以下的輸出:

John is 25 
Amy is 27 

下面的代碼也可以工作(假設從這裏開始的johnamy的所有例子已經按照前面的例子創建):

john.display(); 
amy.display(); 

這將使該輸出:

John, age 25 
Amy, age 27 

現在,由於johnamyPerson特定情況下,他們不能引用靜態變量或調用靜態方法,所以無論這些代碼下一行會是不可編譯:

System.out.println(john.people.size()); 
amy.displayAll(); 

但是,下面將工作:

System.out.println(Person.people.size()); 
Person.displayAll(); 

這將使該輸出:

2 
John, age 25 
Amy, age 27 

但是,以下是行不通的:

Person.display(); 
System.out.println(Person.name); 
System.out.println(Person.age); 

Person.display()不起作用,因爲display()不是一個靜態方法。接下來的兩行不起作用,因爲變量nameage屬於Person的特定實例,並且通常不適用於Person類。

+0

感謝您的好例子@Bethany Louise。這非常有幫助!只是爲了讓你知道'amy.displayAll();'工作,但有警告。但那甚至不是我所要求的,所以這完全沒問題。 :) http://imgur.com/AsMPuGN – TheProgrammer

+0

不客氣!我很高興我能幫上忙! :) –