了解 Java 中的静态方法
Understanding static methods in Java
谁能帮我理解下面的语句是什么意思?
"Like any method, a static method can create or use named objects of its type, so a static method is often used as a “shepherd” for a flock of instances of its own type. "
这是一个例子:假设你有一个 class 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
class 本身,因为它是静态的,而 name
和 age
是非静态的并且属于 Person
中的每个 instance
。同样,因为displayAll()
是静态的,所以只能被Person
调用,而非静态的display()
只能被Person
.[=44的个别实例调用=]
为了说明这一点,假设您在主 class:
中有这个
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
class .
谁能帮我理解下面的语句是什么意思?
"Like any method, a static method can create or use named objects of its type, so a static method is often used as a “shepherd” for a flock of instances of its own type. "
这是一个例子:假设你有一个 class 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
class 本身,因为它是静态的,而 name
和 age
是非静态的并且属于 Person
中的每个 instance
。同样,因为displayAll()
是静态的,所以只能被Person
调用,而非静态的display()
只能被Person
.[=44的个别实例调用=]
为了说明这一点,假设您在主 class:
中有这个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
class .