了解 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. "

来源:http://www.codeguru.com/java/tij/tij0037.shtml#Heading79

这是一个例子:假设你有一个 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 本身,因为它是静态的,而 nameage 是非静态的并且属于 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);

这将创建 Personjohnamy 的两个实例,并会产生以下输出:

John is 25
Amy is 27

下面的代码也可以工作(假设这里的所有示例都已经像前面的示例一样创建了 johnamy):

john.display();
amy.display();

这将给出以下输出:

John, age 25
Amy, age 27

现在,因为 johnamyPerson 的特定实例,它们不能引用静态变量或调用静态方法,所以接下来的这两行代码将无法编译:

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() 不是静态方法。接下来的两行不起作用,因为变量 nameage 属于 Person 的特定实例并且通常不适用于 Person class .