【问题标题】:May static and non static variables have the same name静态和非静态变量可以同名
【发布时间】:2014-10-06 18:53:09
【问题描述】:

我有一个类,我需要两个变量,一个是静态的,另一个是非静态的。我的问题是当我们声明两个变量时,我们可以用相同的名称声明它们吗?

为什么我问这个问题是静态变量和非静态变量存储在两个不同的区域(方法区域中的静态变量和堆区域中的非静态(实例)变量)。 那么,如果我用相同的名称声明它们会发生什么?如果错了,原因是什么?

【问题讨论】:

  • 不,你不能在同一个类中声明两个同名的成员变量,不管一个是静态的,另一个不是。如果两个变量具有相同的名称,Java 无法知道您指的是哪个变量。
  • 不能在同一个作用域(例如同一个类)中声明两个同名变量。问:为什么要尝试?就为了变态?
  • 没有。变量名称在每个范围内必须是唯一的。类级别的静态与非静态没有不同的范围。
  • 感谢您为我解惑
  • @FoggyDay:Java 允许您声明两个具有相同名称但参数列表不同的不同方法。为什么不是两个具有相同名称和不同存储类的不同变量?至少我能想到的一种编程语言(ruby)可以让你做到这一点。它在 ruby​​ 中有效,因为引用类变量的语法与引用成员变量的语法不同。

标签: java variables static


【解决方案1】:

不,您不能执行以下操作:

public class X{
    int a;
    static int a = 10; //Illegal
    public X(int a){
        this.a = a;
    }
}

原因是两个as 都在x 实例的范围内。对于:

X x = new X(5); 
x.a; //were the static field with name a legal, this refers to both 5 and 10.

目前尚不清楚所指的是a 的哪个版本。因此,为防止混淆,这是非法的。

【讨论】:

    【解决方案2】:

    您可以在方法内部有一个与类作用域变量同名的变量。通常,当从方法内部引用变量名时,方法中的变量优先于类范围变量。为了使您的代码更加清晰并确保您访问的是正确的代码,请使用 this 关键字来引用方法内部的变量并使用 super关键字来引用类范围的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多