Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我可以声明变量的数据类型两次?_Java_Class_Object_Variables_Types - Fatal编程技术网

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

Java 为什么我可以声明变量的数据类型两次?,java,class,object,variables,types,Java,Class,Object,Variables,Types,在下面的代码中: 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) { S

在下面的代码中:

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的数据类型。为什么要执行此代码?

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

在这种情况下,该声明是完全无用的,因为一旦构造函数结束,该变量就会消失


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

声明一个变量还涉及声明其数据类型,因此您本质上要求声明同一个变量两次

假设不可能两次声明同一个变量,这是正确的,但这不会发生在代码中。你的

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

你的

是在方法中定义的局部变量,在本例中,该方法是构造函数。它在语法上是合法的,因为它不是
Square
的成员,因此它与该成员无关。说到这里,我必须指出,您犯了一个错误,因为在构造函数中,您声明了一个与数据成员同名的变量,初始化了局部变量,然后您从未使用过它,而在另一种方法中,您假设
已初始化。因此,您几乎肯定打算在构造函数中初始化数据成员,如:

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

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

这被称为变量阴影:请参阅,因为无论这多么不幸,只要没有范围冲突,您就可以声明与现有变量同名的新变量。那里没有。您没有两次声明变量的数据类型。您正在声明两个不同的变量。此外,这将是一个编译错误,而不是运行时错误。这也是为什么在构造函数和变量中使用名为
side
的变量作为参数是合法的原因。您不是两次声明变量的数据类型,而是声明字段和局部变量,这是两件不同的事情。
public Square(double a) 
{
    side = a;
}