首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么静态类不能有非静态的方法和变量?

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

Stack Overflow用户
提问于 2011-10-16 18:54:49
回答 3查看 27.7K关注 0票数 12

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-16 18:56:15

静态类首先不能被实例化,所以即使你可以声明非静态(实例)成员,它们也永远不能被访问。因为确实没有理由允许这样做,所以语言简单地禁止了它。

请记住,静态类就是类,而与非静态类有直接关系的有两件事:类本身和类的实例/对象。

非静态类可以同时具有静态和非静态成员,因此静态成员应用于该类,而非静态成员应用于该类的实例。

票数 30
EN

Stack Overflow用户

发布于 2011-10-16 18:57:47

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

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

票数 3
EN

Stack Overflow用户

发布于 2020-02-19 02:13:34

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

代码语言:javascript
复制
class Person {
  private final String name;

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

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

现在让我们在一个示例中尝试使用这个类:

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

那么告诉我,在这个例子中,我们到底希望Person.getName()打印什么?爱丽丝?鲍勃?空吗?

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7783828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档