[英]difference between static and non-static methods
我正在做一個相當簡單的程序,以了解靜態和非靜態方法與變量之間的區別,我以為我理解了,但是我無法運行以下代碼:
public class Zombie {
String name;
int serial = 0;
static int count = 0;
public Zombie(String name) {
this.name = name;
count++;
}
static String printStatus() {
String status;
if(count == 1) {
status = (count + "zombie created so far");
}
else {
status = (count + "zombies created so far");
}
return status;
}
String printZombie() {
String ident = (name + " is zombie " + serial);
return ident;
}
public static void main(String[] args) {
printStatus();
Zombie z1 = new Zombie("Deb");
printStatus();
Zombie z2 = new Zombie("Andy");
printStatus();
Zombie z3 = new Zombie("Carl");
printStatus();
z1.printZombie();
z2.printZombie();
z3.printZombie();
}
}
它的輸出應為:
0 zombies created so far
1 zombie created so far
2 zombies created so far
3 zombies created so far
Deb is zombie 0
Andy is zombie 1
Carl is zombie 2
但是我無法運行它。 我認為問題(至少其中一個)是第一種方法,但我無法弄清楚。 count應該是靜態的,而其他兩個變量不是,而printStatus應該是靜態的,而printZombie不是。 有人可以向我解釋一下嗎?
您完全正確:
1)“靜態”和“非靜態”之間的區別基本上是“全類”和“每個對象實例”之間的區別。
2)您的“計數”從0(在創建第一個僵屍之前)到3(在創建最后一個僵屍之后)。
3)所有三個對象都引用相同的靜態“計數”。
我沒有得到的是“串行”如何遞增:(您是否在代碼示例中遺漏了任何東西?
這是我從您的代碼中得到的:
// Modified code
public class Zombie {
String name;
int serial = 0;
static int count = 0;
public Zombie(String name) {
System.out.println ("Zombie(" + name + "): serial=" + serial + ", count=" + count + "...");
this.name = name;
count++;
}
static String printStatus() {
System.out.println ("printStatus: count=" + count + "...");
String status;
if(count == 1) {
status = (count + " zombie created so far");
}
else {
status = (count + " zombies created so far");
}
System.out.println (" " + status);
return status;
}
String printZombie() {
System.out.println ("printZombie: serial=" + serial + ", count=" + count + "...");
String ident = (name + " is zombie " + serial);
System.out.println (" " + ident);
return ident;
}
public static void main(String[] args) {
printStatus();
Zombie z1 = new Zombie("Deb");
printStatus();
Zombie z2 = new Zombie("Andy");
printStatus();
Zombie z3 = new Zombie("Carl");
printStatus();
z1.printZombie();
z2.printZombie();
z3.printZombie();
}
}
對應的輸出:
printStatus: count=0...
0 zombies created so far
Zombie(Deb): serial=0, count=0...
printStatus: count=1...
1 zombie created so far
Zombie(Andy): serial=0, count=1...
printStatus: count=2...
2 zombies created so far
Zombie(Carl): serial=0, count=2...
printStatus: count=3...
3 zombies created so far
printZombie: serial=0, count=3...
Deb is zombie 0
printZombie: serial=0, count=3...
Andy is zombie 0
printZombie: serial=0, count=3...
Carl is zombie 0
static是屬於Class的上下文,非靜態方法在對象的上下文下執行
printStatus();
對於所有僵屍都完全相同,而printZombie
將取決於對象。
通常,靜態方法應該是獨立的,例如數學函數。
Math.divide(NumberA, NumberB)
可以使用類本身作為引用在類外部調用靜態屬性/方法,如下所示:
Zombie.count
,如果您在類內部,則可以像在main方法中一樣使用它,但看起來可能會令人困惑
無需實例化類即Zombie.printStatus();即可訪問靜態方法。 與printZombie方法相反,后者只能在創建新的Zombie對象時訪問。
當您說無法運行它時,您是什么意思? 怎么了 我認為它正在運行,但是您沒有將輸出定向到控制台:
您應該這樣做:
System.out.println(printStatus());
這是因為printStatus()僅返回String。
簡單地說,靜態變量無論實例化多少次,都只有一個副本。 非靜態變量則相反,即副本的數量與其實例化的次數一樣多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.