了解Java中的静态方法

时间:2015-11-04 04:39:55

标签: java static static-methods

有人可以帮我理解以下声明的含义吗?

“与任何方法一样,静态方法可以创建或 使用其类型的命名对象 ,因此静态方法通常用作 “牧羊人”为一群自己类型的实例 。“

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

1 个答案:

答案 0 :(得分:1)

以下是一个例子:假设您有一个类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类本身,因为它是静态的,而nameage是非静态的,属于每个{{1} } instance。同样,因为Person是静态的,所以只能由displayAll()调用,而非静态Person只能由display()的单个实例调用。

为了说明这一点,请说你在主要课程中有这个:

Person

这会创建两个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); Personjohn的实例,并会提供以下输出:

amy

以下代码也可以使用(假设此处的所有示例John is 25 Amy is 27 john已经创建,如上例所示):

amy

这会给出这个输出:

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

现在,因为John, age 25 Amy, age 27 johnamy的特定实例,所以它们不能引用静态变量或调用静态方法,因此这两行代码都不可编译:< / p>

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类。 / p>