【问题标题】:Why can I declare the datatype of a variable twice?为什么我可以两次声明一个变量的数据类型?
【发布时间】:2020-05-16 05:26:38
【问题描述】:

在下面的代码中:

public class Square 
{
    private double side;

    public Square(double a) 
    {
        double side = a;
    }

    public double area()
    {
        return side * side;
    }

    public static void main(String[] args) 
    {
        Square r = new Square(10.0);
        System.out.println(r.area());
    }
}

当字段被声明时:

 private double side;

然后在构造函数中:

double side = a;

为什么没有抛出错误?

我会这样认为,因为我们将变量 double 的数据类型声明了两次。为什么这段代码会执行?

【问题讨论】:

  • 这称为变量阴影:见stackoverflow.com/questions/1092099/…
  • 因为无论多么不幸,只要不存在范围冲突,您就可以声明与现有变量同名的新变量。哪个不存在。您没有两次声明变量的数据类型。您正在声明两个不同的变量。此外,这将是编译错误,而不是运行时错误。
  • 在你的构造函数和修改器中使用一个名为 side 的变量作为参数是合法的。
  • 你不是在声明一个变量的数据类型两次,你是在声明一个字段和一个局部变量,这是两个不同的东西。

标签: java class object variables types


【解决方案1】:

声明一个变量也涉及到声明它的数据类型,所以你实际上是在询问是否两次声明同一个变量。

您认为不可能两次声明同一个变量是正确的,但您的代码中不会发生这种情况。你的

private double side;

Square对象的数据成员,即squares的属性。它在class 定义的块中声明,因此它是一个数据成员。

你的

double side = a;

是在方法中定义的局部变量,在我们的例子中是构造函数。它在语法上是合法的,因为它不是Square 的成员,因此它与该成员无关。现在,我必须提到你犯了一个错误,因为在构造函数中你已经声明了一个与你的数据成员同名的变量,初始化了你的局部变量然后你永远不会使用它,而在另一种方法中你假设side 已初始化。所以你几乎肯定打算在你的构造函数中初始化你的数据成员,比如:

public Square(double a) 
{
    this.side = a;
}

甚至

public Square(double a) 
{
    side = a;
}

【讨论】:

    【解决方案2】:

    因为第二个声明了构造函数的局部变量。它掩盖了成员变量(您仍然可以通过this.side 访问它)。

    在这种情况下,该声明完全没有用,因为该变量将在构造函数结束时消失。

    此外,即使这是一个问题,它也不会引发运行时错误。这将是一个编译时错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2017-04-30
      • 2019-11-20
      • 2020-05-31
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多