有人可以幫助我理解以下語句的含義嗎?瞭解Java中的靜態方法
「其他任何方法一樣,靜態方法可以創建或使用命名其類型的對象,所以靜態方法經常被用來作爲一個‘牧羊人’爲它自己的類型的情況下,一羣「
來源:http://www.codeguru.com/java/tij/tij0037.shtml#Heading79
有人可以幫助我理解以下語句的含義嗎?瞭解Java中的靜態方法
「其他任何方法一樣,靜態方法可以創建或使用命名其類型的對象,所以靜態方法經常被用來作爲一個‘牧羊人’爲它自己的類型的情況下,一羣「
來源:http://www.codeguru.com/java/tij/tij0037.shtml#Heading79
這裏有一個例子:假設你有一個類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
類本身,因爲它是靜態的,而name
和age
爲非靜態和屬於的每個Person
instance
。同樣,因爲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);
這將創造Person
,john
和amy
兩個實例,並會給出以下的輸出:
John is 25
Amy is 27
下面的代碼也可以工作(假設從這裏開始的john
和amy
的所有例子已經按照前面的例子創建):
john.display();
amy.display();
這將使該輸出:
John, age 25
Amy, age 27
現在,由於john
和amy
是Person
特定情況下,他們不能引用靜態變量或調用靜態方法,所以無論這些代碼下一行會是不可編譯:
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()
不是一個靜態方法。接下來的兩行不起作用,因爲變量name
和age
屬於Person
的特定實例,並且通常不適用於Person
類。
感謝您的好例子@Bethany Louise。這非常有幫助!只是爲了讓你知道'amy.displayAll();'工作,但有警告。但那甚至不是我所要求的,所以這完全沒問題。 :) http://imgur.com/AsMPuGN – TheProgrammer
不客氣!我很高興我能幫上忙! :) –
坦率地說,'static'方法可以創建任意類型的任意數量的實例。不知道作者想說什麼。您應該在該網站上詢問此問題 – TheLostMind
理想情況下,您應該在該網站的評論下留下您的問題,因爲我看到有一個框可以這樣做。 –
@JunedAhsan我同意。我不明白爲什麼StackOverflow應被視爲任意Internet垃圾的驗證站點。 – EJP