Javascript 为什么可以';我不能在Java中声明同一个变量两次吗?

Javascript 为什么可以';我不能在Java中声明同一个变量两次吗?,javascript,java,Javascript,Java,这里也有类似的问题,但它们并没有真正回答我的问题 所以我很好奇为什么我们不能在Java中声明同一个变量两次 例如: int a = 4; int a = 6; 这在Java中是行不通的 但是,在javascript中,这实际上是可行的: var a = 1; var a = 2; 在javascript中,人们说声明立即移到了开头,所以它变成了这样: var a; a = 1; a = 2; 如果作用域不重叠,您可以使用相同的变量名,例如,我可以在一个名为“var1”的私有方法中使

这里也有类似的问题,但它们并没有真正回答我的问题

所以我很好奇为什么我们不能在Java中声明同一个变量两次

例如:

  int a = 4;
  int a = 6;
这在Java中是行不通的

但是,在javascript中,这实际上是可行的:

var a = 1;
var a = 2;
在javascript中,人们说声明立即移到了开头,所以它变成了这样:

var a;
a = 1;
a = 2;

如果作用域不重叠,您可以使用相同的变量名,例如,我可以在一个名为“var1”的私有方法中使用一个变量,然后在另一个方法中使用相同的变量名,这两个变量不会冲突


但是,由于每次我在同一作用域中使用“int var1”,java都会重新声明变量,因此它不允许这样做,因为它是一个冲突的变量名,而在java脚本中,声明只发生一次,因为它是弱类型的

如果作用域不重叠,您可以使用相同的变量名,例如,我可以在一个名为“var1”的私有方法中使用一个变量,然后在另一个方法中使用相同的变量,这两个变量不会冲突


然而,由于每次我在同一个范围内使用“int var1”,java都会重新声明变量,它不允许这样做,因为它是一个冲突的变量名,而在java脚本中,声明只发生一次,因为它是弱类型的

,简单而明显的答案是,编译器不允许这样做。但现在让我们更进一步——为什么需要这样做

这里的原因是,两次声明变量是错误的标志。它通常意味着三件事之一:

  • 变量名不够具体。也许你用了两次
    int-length
    ,它会对你咆哮。在复制数组或其他内容时,您可能应该使名称更具体地表示其长度,例如
    int originalLength
    int extendedLength
  • 你的方法太长了。为什么您的方法如此长,以至于需要两个相同的变量?很可能您正在复制代码,所以将其整合到一个方法中
  • 你还没有真正想出你的方法。这是数字2的一种扩展,但事实是,在编写方法之前,您应该决定方法的功能。如果您要添加一个已经存在的变量,这可能意味着您还没有决定这个方法到底在做什么
  • 每一种都是一种主要的代码气味,并且可能是未来bug的来源。(而且不远了!)在每种情况下,允许您两次声明一个变量会导致歧义,如果它阻止您编译的话,就会避免这种歧义


    现在,这是否意味着在某些情况下这可能是好事?当然可能有。也许您已经涵盖了所有的基础,并且您绝对确定重用该变量是可以的。在这种情况下,只需重新分配它,而不是重新定义它。就个人而言,我建议不要这样做,但如果你想开枪,那是你的脚。:)

    简单而明显的答案是,编译器不允许您这样做。但现在让我们更进一步——为什么需要这样做

    这里的原因是,两次声明变量是错误的标志。它通常意味着三件事之一:

  • 变量名不够具体。也许你用了两次
    int-length
    ,它会对你咆哮。在复制数组或其他内容时,您可能应该使名称更具体地表示其长度,例如
    int originalLength
    int extendedLength
  • 你的方法太长了。为什么您的方法如此长,以至于需要两个相同的变量?很可能您正在复制代码,所以将其整合到一个方法中
  • 你还没有真正想出你的方法。这是数字2的一种扩展,但事实是,在编写方法之前,您应该决定方法的功能。如果您要添加一个已经存在的变量,这可能意味着您还没有决定这个方法到底在做什么
  • 每一种都是一种主要的代码气味,并且可能是未来bug的来源。(而且不远了!)在每种情况下,允许您两次声明一个变量会导致歧义,如果它阻止您编译的话,就会避免这种歧义


    现在,这是否意味着在某些情况下这可能是好事?当然可能有。也许您已经涵盖了所有的基础,并且您绝对确定重用该变量是可以的。在这种情况下,只需重新分配它,而不是重新定义它。就个人而言,我建议不要这样做,但如果你想开枪,那是你的脚。:)

    现在,它已经在javascript中用新的let关键字进行了修正或临时修改 如果尝试多次初始化同一变量名,将抛出错误

          let a = 4;
          let a = 5;
    

    将在ES6中抛出一个错误,现在它已经在javascript中用新的let关键字进行了更正或临时修改 如果尝试多次初始化同一变量名,将抛出错误

          let a = 4;
          let a = 5;
    

    将在ES6中抛出错误,而不是否决表决,但这是一个主观问题。这正是java创建者决定编写java编译器和语言语法的方式。谢谢!我想是有点subjective@aguibert主观问题并不一定就是坏问题。不是否决票,但这是一个主观问题。这正是java创建者决定编写java编译器和语言语法的方式。谢谢!我想是有点subjective@aguibert主观问题并不一定就是坏问题。