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