Java 使用速记法声明和初始化变量:类变量与局部变量

Java 使用速记法声明和初始化变量:类变量与局部变量,java,Java,我在令牌“;”上遇到了一个错误语法错误,应该是。当我使用简写符号将变量声明和初始化为类变量时,就会发生这种情况。如果我以与局部变量完全相同的方式初始化和声明变量,则不会发生此错误 代码看起来完全像这样: public class SomeClass{ double number1, number2; //On this line I get the error I mention above. number1 = number2 = 1.0; } 为什么在使用此符号声明和初始化类变量时会

我在令牌“;”上遇到了一个错误
语法错误,应该是
。当我使用简写符号将变量声明和初始化为类变量时,就会发生这种情况。如果我以与局部变量完全相同的方式初始化和声明变量,则不会发生此错误

代码看起来完全像这样:

public class SomeClass{ 

double number1, number2; //On this line I get the error I mention above.
number1 = number2 = 1.0;

}

为什么在使用此符号声明和初始化类变量时会出现此错误?

此错误仅在它是字段时发生,因此我假设它是字段

这是因为
number1=number2=1.0未初始化类的字段。相反,它是一行代码,必须位于方法块的一侧

要解决此问题,您可以在方法或构造函数中初始化它,或者执行以下操作:

double number1 = 1.0, number2 = 1.0;

在声明类变量时,需要保持其未初始化状态,或者同时初始化一个类变量。如果以后要初始化它,可以将代码放入构造函数中

public class MyClass {
  double number1 = 1.0, number2;

  public MyClass {
    number2  = 2.0;
  }

}
这应该行得通

public class SomeClass
{ 
    double number1, number2; 

    {
        number1 = number2 = 1.0;
    }
}
不能直接在类主体中编写语句;通常语句位于方法体中;它们也可以出现在静态或实例初始值设定项块中

public class Foo
{

    static{  print("foo"); }  // executed during class initialization

    { print("foo"); }  // executed in constructor 

    print("foo");  // Error!

}
JLS

由于某些原因,允许使用空语句:)


(不是真的-孤零零的“;”被简单地丢弃,不算作一个语句)

在这里工作很好:。尝试用再现错误所需的所有代码更新问题。@Radiodef错误在第二行,而不是第一行。仅仅因为它说错误在一个地方,并不意味着它是由其他地方引起的,在这种情况下,它是由
number1=number2=1.0引起的@Forseth11您在这里做了很多假设。Kermit应该更新这个问题,这样我们就不会猜测了。@Radiodef更新了代码,使其看起来与我的IDE中的完全一样。@Radiodef我假设的原因是:“java中出现错误的唯一方法是如果它是类中的字段。”(事实证明,我在新编辑中的假设是正确的。)我很惊讶这不是(可能还没有)在我目前工作的书中提到。我非常感谢您提供的信息丰富且写得很好的答案。实例初始值设定项块不经常使用。但有时它会很方便……我期待着有机会应用这些知识。
ClassBodyDeclaration:
  ClassMemberDeclaration
  InstanceInitializer
  StaticInitializer
  ConstructorDeclaration

ClassMemberDeclaration:
  FieldDeclaration
  MethodDeclaration
  ClassDeclaration
  InterfaceDeclaration
  ;
class Foo
{
    ;
}