Java 静态和非静态方法之间的区别
我正在做一个相当简单的程序,以了解静态和非静态方法和变量之间的区别,我认为我理解了它,但我无法运行以下代码:Java 静态和非静态方法之间的区别,java,Java,我正在做一个相当简单的程序,以了解静态和非静态方法和变量之间的区别,我认为我理解了它,但我无法运行以下代码: 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) {
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) 所有三个对象都引用相同的静态“计数”
我不明白的是“serial”是如何递增的:(你有没有从你的代码样本中漏掉什么
以下是我从您的代码中得到的信息:
// 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
你完全正确:
1) “静态”和“非静态”之间的区别基本上就是“类范围”和“每个对象实例”之间的区别
2) 您的“计数”从0(创建第一个僵尸之前)到3(创建最后一个僵尸之后)
3) 所有三个对象都引用相同的静态“计数”
我不明白的是“serial”是如何递增的:(你有没有从你的代码样本中漏掉什么
以下是我从您的代码中得到的信息:
// 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
静态是属于类的上下文,非静态方法在对象的上下文下执行
printStatus();
对于所有僵尸都完全相同,而printZombie
将取决于对象
通常静态方法应该是独立的,就像数学函数一样
数学除法(NumberA,NumberB)
可以使用类本身作为引用在类外部调用静态属性/方法,如下所示:
Zombie.count
,如果您在类中,您可以像在主方法中一样使用它,但它可能看起来很混乱静态是属于类的上下文,非静态方法在对象的上下文下执行
printStatus();
对于所有僵尸都完全相同,而printZombie
将取决于对象
通常静态方法应该是独立的,就像数学函数一样
数学除法(NumberA,NumberB)
可以使用类本身作为引用在类外部调用静态属性/方法,如下所示:
Zombie.count
,如果您在类中,可以像在主方法中一样使用它,但它可能看起来很混乱可以访问静态方法,而无需实例化类,即Zombie.printStatus();
与printZombie方法相反,printZombie方法只能在创建新的Zombie对象时访问
当你说你不能让它运行时,你是什么意思?出了什么问题?
我认为它正在运行,但您没有将输出定向到控制台:
您应该这样做:
System.out.println(printStatus());
这是因为printStatus()只返回一个字符串。可以访问静态方法,而无需实例化类,即Zombie.printStatus(); 与printZombie方法相反,printZombie方法只能在创建新的Zombie对象时访问 当你说你不能让它运行时,你是什么意思?出了什么问题? 我认为它正在运行,但您没有将输出定向到控制台: 您应该这样做:
System.out.println(printStatus());
这是因为printStatus()只返回一个字符串。非常简单,静态变量只有一个副本,不管它们被实例化多少次。非静态变量正好相反,即副本的数量与它们被实例化的次数相同。非常简单,静态变量只有一个副本,不管它们被实例化多少次。非静态变量变量是相反的,即有与其实例化次数一样多的副本。它不会运行,或者它运行和显示不正确?到底出了什么问题?有一个问题:您没有初始化
serial
变量。将codethis.serial=count;
添加到构造函数中。如果没有,请编译,粘贴编译器错误。如果它没有运行,则粘贴异常报告。您实际上从未打印任何内容。您只返回要打印的字符串。它不会运行,或者它运行并显示不正确?到底是什么出了问题?有一个问题:您没有初始化serial
变量。添加代码this.serial=count;
到构造函数。如果它没有编译,请粘贴编译器错误。如果它没有运行,请粘贴异常报告。您实际上从未打印任何内容。您只需返回要打印的字符串。