为什么我不能在方法外做赋值?

问题描述 投票:0回答:7

如果我尝试为类中的变量赋值,但在方法之外我会收到错误消息。

class one{
 Integer b;
 b=Integer.valueOf(2);
}

但是,如果我在创建过程中初始化它,它就可以工作。

class one{
 Integer b=Integer.valueOf(2);
}

在方法内部,它在两种情况下都有效。

java variables variable-assignment
7个回答
28
投票

你需要做

class one{
 Integer b;
 {
    b=Integer.valueOf(2);
 }
}

因为语句必须出现在代码块中。

在这种情况下,该块是一个 initailiser 块,它被添加到每个构造函数(或本例中的默认构造函数)它在对

super()
的任何调用之后和任何构造函数中的主代码块之前运行。

顺便说一句:你可以有一个带有

static { }
的静态初始化块,它在类初始化时被调用。

例如

class one{
 static final Integer b;

 static {
    b=Integer.valueOf(2);
 }
}

17
投票

因为assignmentsstatementsstatements允许仅在代码块(方法,构造函数,静态初始化器等)中

在这些之外,只允许声明。

这个:

  class one{
        Integer b=Integer.valueOf(2);
  }

是带有初始值设定项的声明。这就是为什么被接受


2
投票

一个更笼统的答案是类主体是关于declarations,而不是statements。对于出现在类主体中的语句有特殊规定,但它们必须明确标记为 class initializersinstance initializers.


1
投票

在Java中,在定义类时,可以定义具有默认值的变量和添加方法。任何可执行代码(例如赋值)都必须包含在方法中。


1
投票

这就是 java 的工作方式,你不能在类中添加非声明代码(抱歉我不知道正确的术语),该代码应该在方法内部。


0
投票

我认为就术语而言,其他几个答案略有偏差。声明也是声明。实际上,它们被称为“声明语句”,是三种语句中的一种。赋值语句是“表达式语句”的一种形式,只能用于方法、构造函数和初始值设定项等构造中。查看此 Oracle 教程链接中的语句部分


0
投票

方法有责任对成员变量执行突变。如果需要初始化成员变量,java提供了一种在构造、类定义(后一种情况)期间进行初始化的方法。但是在定义期间不能执行突变。(前例)。它通常在方法级别完成。

对象是用来保存状态的,而方法是用来操作那个状态的。

© www.soinside.com 2019 - 2024. All rights reserved.