【问题标题】:Why toString() cannot be a static method?为什么 toString() 不能是静态方法?
【发布时间】:2014-01-03 07:31:06
【问题描述】:

伙计们,我有一个简单但令人讨厌的问题。 据我了解,static 基本上意味着,对于该类的每个实例,此方法都是相同的,如果我们更改它,该方法将针对该类的每个实例而更改,它也称为类方法.好吧,如果我有一个类以某种格式实现toString () 方法,那么假设:

public String toString() {  
    return "(" + x + "," + y + ")";
}

为什么不能设置为静态?因为对于该类的每个实例,这种格式都是相同的......?

【问题讨论】:

  • 想想 x 和 y。如果它们是非静态字段,则静态方法无法访问它们。
  • @PatriciaShanahan 所以你说如果 x 和 y 是静态值,toString() 方法可以设置为静态?
  • 您对static 的理解略有偏差。 static 表示只创建一个实例(至少对于变量)。您甚至可以在不实例化对象的情况下访问static 变量/方法(例如ClassName.toString()。此外,您不必为每个对象创建一个新方法;它们都有相同的可用方法
  • 否,因为在 Object 类中,toString() 不是静态的。如果你愿意,你可以为它创建一个静态方法,但是像 System.out.println 这样的东西不会调用它。
  • 我写了一个答案,直到我意识到这个问题没有意义。您已经定义了一次方法,您应该在哪里重新定义它?

标签: java class static access-modifiers


【解决方案1】:

这不仅仅适用于toString()

Java Language Specification

如果静态方法 hides 是一个实例,则会出现编译时错误 方法。

由于实例方法 toString() 隐式继承自 Object,因此在子类型中将方法 toString() 声明为 static 会导致编译时错误。

从面向对象的角度来看,请参阅此问题的其他答案或related 问题。

【讨论】:

  • 在这种情况下,它适用于equals()hashCode()
  • @Quincunx 是的,任何可见的实例方法。
【解决方案2】:

因为静态方法不能访问实例字段。此外,toString()java.lang.Object 指定,因此您必须有一个 Object 实例才能调用 toString()。最后,如果toString() 是静态的,它就必须接受 Object 的实例(否则你怎么能在类的 n 实例上调用 toString() 呢?)。

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2011-04-26
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多