为什么静态类不能有非静态方法和变量?

时间:2011-10-16 10:54:49

标签: c# .net oop class static

当非静态类可以有静态方法和变量时,为什么静态类不能有非静态方法和变量?

在非静态类中使用静态方法和变量有什​​么好处?虽然在非静态类中使用静态构造函数是可以理解的。

3 个答案:

答案 0 :(得分:27)

静态类无法在第一时间实例化,因此即使您可以声明非静态(实例)成员,也永远无法访问它们。由于这个原因确实没有一点允许它,语言只是禁止它。

请记住,静态类只是类,而有两件事与非静态类直接相关:本身,以及类的实例/对象

非静态类可以同时包含静态成员和非静态成员,以便静态成员应用于类,而非静态成员应用于该类的实例。

答案 1 :(得分:2)

静态类不能包含非静态成员,因为根据定义它无法实例化,因此不可能使用这些成员。

但是,非静态类中的静态成员可以在没有类实例的情况下使用 - 有点不同的情况,即实用方法或工厂方法。

答案 2 :(得分:-1)

假设您有一个具有字段名称的Person类。而且,为了便于讨论,我们假设Java确实允许静态方法直接访问非静态成员变量。然后,我们可以为Person指定一个getName静态方法,如下所示:

class Person {
  private final String name;

  public Person(String name) {
    this.name = name;
  }

  public static String getName() {
    return name;
  }
}

现在让我们尝试在示例中使用此类:

public static void main(String[] args) {
  Person alice = new Person("Alice");
  Person bob = new Person("Bob");
  System.out.println("name: " + Person.getName());
}

所以告诉我,在此示例中,我们希望Person.getName()打印什么?爱丽丝?鲍勃?空值?

没有正确的答案。这没有任何意义,因为名称是属于个人(实例)的东西,而不是整个类的东西。显然,我们无法使用静态方法访问非静态成员,因为我们无法知道应该访问哪些非静态成员。