为什么我可以两次声明变量的数据类型?

3
在下面的代码中:
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。为什么这段代码还是能够执行?


1
这被称为变量遮蔽:请参见https://dev59.com/8XNA5IYBdhLWcg3wGJwV - user6073886
1
然而不幸的是,你可以声明与现有变量同名的新变量,只要没有作用域冲突。这里没有。你并没有两次声明变量的数据类型,而是声明了两个不同的变量。此外,这将是编译错误,而不是运行时错误。 - kumesana
1
同样的原因,为什么在构造函数和修改器中使用名为side的变量作为参数是合法的。 - Anil M
你不是在两次声明变量的数据类型,而是在声明一个字段和一个局部变量,这是两个不同的事情。 - Mark Rotteveel
2个回答

5

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

在这种情况下,那个声明是完全无用的,因为那个变量将在构造函数结束时消失。

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


2

声明一个变量涉及声明其数据类型,因此您实际上是在询问是否声明了相同的变量两次。

您正确地认为不能声明相同的变量两次,但这并未发生在您的代码中。您

private double side;

这是Square对象的数据成员,也就是正方形的一个属性。它在class定义的块中声明,因此它是一个数据成员。

你的

double side = a;

这是在方法中定义的局部变量,我们的情况下是构造函数。从语法上讲是合法的,因为它不是Square的成员,因此与成员无关。现在,我必须提到你犯了一个错误,在构造函数内部你声明了一个与数据成员同名的变量,初始化了你的局部变量,然后你从未使用过它,而在另一个方法中你假定side已经被初始化。所以你几乎肯定想要在构造函数中初始化你的数据成员,像这样:

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

甚至更多
public Square(double a) 
{
    side = a;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接