簡體   English   中英

靜態和非靜態方法之間的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM