【问题标题】:Understanding static methods in Java了解 Java 中的静态方法
【发布时间】:2015-11-04 04:39:55
【问题描述】:

谁能帮我理解下面的语句是什么意思?

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

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

【问题讨论】:

  • 坦率地说,static 方法可以创建任意数量的任意类型的实例。不知道作者想说什么。你可能应该在那个网站上问这个
  • 理想情况下,您应该在该网站的 cmets 下留下您的问题,因为我看到有一个框可以这样做。
  • @JunedAhsan 我同意。我不明白为什么 StackOverflow 应该被视为任意 Internet 垃圾的验证站点。
  • 你为什么要这么粗鲁,说那是垃圾?成千上万的人在其他网站上阅读和学习,如果他们学错了,就应该纠正(即使这需要 StackOverflow 的帮助)。这不就是 StackExchange 的重点:向每个人传授正确的学习吗?

标签: java static static-methods


【解决方案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 是非静态的,属于Person 的每个instance。同样,因为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);

这将创建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 类。

【讨论】:

  • 感谢@Bethany Louise 的好榜样。这有很大帮助!只是为了让您知道amy.displayAll(); 工作但有警告。但这甚至不是我要问的,所以这完全没问题。 :) imgur.com/AsMPuGN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多