Java 方法在花括号内工作,但不在花括号外工作

Java 方法在花括号内工作,但不在花括号外工作,java,android,Java,Android,这可能是一个基本问题,但请帮助我。我在为一个井字游戏写代码。我想使用hashmap来记录每个框的状态 public class tictactoe extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.

这可能是一个基本问题,但请帮助我。我在为一个井字游戏写代码。我想使用hashmap来记录每个框的状态

public class tictactoe extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tictactoe);
    }
    boolean player = true;
    
    Map<Integer , Integer> hashMaps = new HashMap<>();

    {hashMaps.put(233, 333);}


    public void thismeth(View view) {
        ImageView ig = (ImageView) view;
        ig.getId();

        if(player){ig.setImageResource(R.drawable.cross);
        player = false;
        ig.setEnabled(false);}
        else{
            ig.setImageResource(R.drawable.zero1);
            player = true;

            ig.setEnabled(false);
        }

    }
}
公共类TictaToe扩展AppCompative活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tictactoe);
}
布尔player=true;
Map hashMaps=新HashMap();
{hashMaps.put(233333);}
公共作废此方法(视图){
ImageView ig=(ImageView)视图;
ig.getId();
if(player){ig.setImageResource(R.drawable.cross);
player=false;
ig.setEnabled(false);}
否则{
ig.setImageResource(R.drawable.zero1);
玩家=真;
ig.setEnabled(假);
}
}
}
上面的代码片段不会在hashmap中抛出任何错误

public class tictactoe extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tictactoe);
    }
    boolean player = true;

    Map<Integer , Integer> hashMaps = new HashMap<>();

    hashMaps.put(233, 333);


    public void thismeth(View view) {
        ImageView ig = (ImageView) view;
        ig.getId();

        if(player){ig.setImageResource(R.drawable.cross);
        player = false;
        ig.setEnabled(false);}
        else{
            ig.setImageResource(R.drawable.zero1);
            player = true;

            ig.setEnabled(false);
        }

    }
} 
公共类TictaToe扩展AppCompative活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tictactoe);
}
布尔player=true;
Map hashMaps=新HashMap();
hashMaps.put(233333);
公共作废此方法(视图){
ImageView ig=(ImageView)视图;
ig.getId();
if(player){ig.setImageResource(R.drawable.cross);
player=false;
ig.setEnabled(false);}
否则{
ig.setImageResource(R.drawable.zero1);
玩家=真;
ig.setEnabled(假);
}
}
} 

而此代码将put()显示为无效方法。没有花括号,它不工作,但有花括号,它工作。有人能解释一下为什么它与curl括号一起工作吗?

您只能像第一个示例中那样声明或初始化类中的对象。如果需要使用它,那么它应该位于方法或初始化块中

大括号表示初始化块。这将在每次实例化类的对象时运行

{
    // initialize...
}
初始化块也可以是静态的。一个类只能运行一次

static {
    // ....
}

解释相当简单:因为Java语言规范这么说

具体来说,代码不能出现在类中。代码只能出现在其他内容中,例如方法、构造函数、初始值设定项或字段初始化表达式,这些内容可以在类中

因此:

不编译(其思想是:您希望该代码何时运行?不清楚,因此,该代码没有意义,无意义的代码最好不编译)

相比之下,这:

class Example {
    private static final boolean whatever = sayHello();

    public static boolean sayHello() {
        System.out.println("Hello");
        return false;
    }
}
编译很好,尽管我们这里有两个“code”实例:
sayHello
方法包含说hello的代码,以及
无论什么
字段包含代码
sayHello()
=
符号后面的表达式

请考虑一下:可以使用立即值声明字段。这些都是法律领域的声明:

long x;
long y = 10;
long z = System.currentTimeMillis();
然而,最后一个确实需要实际执行代码(编译器不能为您“预运行”,当前时间当然不是常数)。您可以使用一个称为“初始值设定项”的构造来实现更大的灵活性:有“加载类时运行的代码”和“创建新实例时运行的代码”。最后一个有点模糊;您可能会认为:在创建实例时运行的构造函数——这是真的,但类似于:
类示例{long z=System.currentTimeMillis();}
没有(可见的)构造函数,但在编写
新示例()
时需要运行代码。因此,是的,还有实例初始化代码

编写初始值设定项的语言语法(允许您在类或实例初始化期间运行任意代码,在使用代码初始化字段时,编译器将需要运行的代码放在同一位置),如下所示:

静态初始值设定项(在应用程序中任何位置首次使用该类时运行):

实例初始值设定项:

{ codeHere(); }
是的,只要牙套。这是一个可以粘贴在类中的元素,这意味着:这是一个实例初始值设定项-在创建新实例时运行

这就是粘贴
地图时创建的内容。将
语句放入
{}
中。具体而言,以下是您的
类tictactoe
结构的直接内容:

  • 创建时受保护的void(Bundle savedInstanceState)
    -一种方法。这些都是可以接受的

  • boolean player=true-一个新字段;可以接受。使用直接在生成的类/apk文件中硬编码的常量值初始化

  • Map hashMaps=new HashMap()-一个新字段;可接受,使用代码初始化,将转换为实例初始值设定项

  • {hashMaps.put(233333);}
    -实例初始值设定项。它将与
    hashMaps=newhashmap()一起添加到实例初始值设定项中

  • public void thismeth(View-View){
    -一种新方法


所有可以接受的东西。而只是
hashMap.put(233333);
,这是一个表达式语句,不起作用-语句不能进入类内部,只能进入方法、构造函数、实例初始值设定项和静态初始值设定项内部。

hashMap有随机整数值这能回答您的问题吗?
static { codeHere(); }
{ codeHere(); }