我正在尝试制作一个简单的子手游戏。我需要帮助的方面是宣布hangman阶段,这是一个arraylist。将此列表移出我的主类之外后,我收到了一些以前未报告的语法错误警告。
我可以将其移回主类,但这对我来说就意味着在一个地方放置太多代码。我也想深入了解这个问题。
public static void main(String[] args) {
// omitted game setup code, ArrayList has been imported
}
public class hangMen{
// here is where the error occurs
// all of the lines below show a syntax error
// All the lines have Syntax error on token ";" & ".", @ expected
List<String> stage = new ArrayList<String>();
stage.add("-------");
stage.add("| |");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|___________");}
//最后一行有语法错误,插入“)”以完成方法声明,插入标识符以完成MethodHeaderName,插入“ SimpleName”以完成限定名称
我以前从未见过这种情况,我的老师也很困惑。有帮助吗?
答案 0 :(得分:1)
您的代码必须位于一个块内。它不能直接在类中。
假设这是初始化,则可以将add
放在初始化程序块中:
List<String> stage = new ArrayList<String>();
{ // Add
stage.add("-------");
stage.add("| |");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|___________");
} // Add
,但是使用初始化程序块是非常不寻常的。将初始化放入构造函数中等效于使用初始化器,但这是执行“复杂”初始化的更常见的地方:
List<String> stage = new ArrayList<String>();
hangMen() {
stage.add("-------");
stage.add("| |");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|___________");
}
或者,您可以声明一个方法:
List<String> stage = buildStage();
List<String> buildStage() {
List<String> stage = new ArrayList<>();
stage.add("-------");
stage.add("| |");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|___________");
}
但是我只想使用Arrays.asList
内联声明列表:
List<String> stage = new ArrayList<>(Arrays.asList(
"-------",
"| |",
"|",
"|",
"|",
"|",
"|___________"));
答案 1 :(得分:1)
类是在编译时定义的模板,可在运行时用于实例化对象。就像切饼机一样,它是冲压出一系列Cookie的模板。
每次您的应用制作另一个对象(在这种情况下为另一个HangMen游戏)时,您可能需要进行一些设置工作才能使该对象准备就绪。这项工作通常以constructor方法完成。构造函数是一种特殊的方法,其名称与类名完全相同。构造函数的特殊之处还在于,它没有指定返回值。其他所有方法都必须指定返回类型或指定void
,而构造函数则不指定。 Java平台保证构造函数一直运行到对象完全投入使用之前。
您可以在切出cookie并装饰cookie的那一刻将其视为构造函数。只有完成装饰后,您才能将Cookie放在可以食用的盘子上,就像准备将其投入使用一样。
提示:我发现用注释行标记我的构造方法很有帮助。读取代码时使其更易于扫描。
这种创建,准备,投入使用并最终在运行时停止大量软件的过程称为 lifecycle ,它是在编程中应学习的关键概念之一。
要保留字符串列表以备初始构造后使用,请在课程上define the variable as a member field。
而且,在现代Java中,您无需在< String >
上重复ArrayList
,因为编译器可以弄清楚这一点。
确保学习并遵循Java命名约定。类名应以大写字母开头。所以HangMen
,而不是hangMen
。相反,持有对对象(实例)的引用的变量以小写字母开头。
public class HangMen{
// ----| Members |------------------------
private List< String > stage ;
// ----| Constructor |------------------------
public HangMen() {
this.stage = new ArrayList<>() ;
stage.add("-------");
stage.add("| |");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|");
stage.add("|___________");}
}
public void report() {
System.out.println( "stage: " ) ;
System.out.println( this.stage.toString() ) ;
}
}
让我们通过main
方法尝试该类。
HangMen hangMen = new HangMen() ; // Invokes your constructor implicitly. At runtime, the class `HangMen` (note the uppercase `H`) is used to create a new instance (new object). A reference to the object is assigned to the variable named `hangMen` (note the lowercase `h`).
hangMen.report() ; // Invokes the `report` method for this instance (this object).
请注意,this.stage
与stage
的使用关系。 this.
明确表示您的意思是成员变量,而不是局部变量。当您引用成员变量与局部变量时,编译器通常可以自行检测。在以前的几年中,我更喜欢使用this.
来使代码阅读更加清晰。但是现在IDE带有其着色功能,提供了关于哪些变量是成员变量还是局部变量的直观线索。因此,您可能要省略this.
前缀。我以这两个为例。
提示:为清楚起见,请勿在{{1}}类中放置main
方法。将其放在自己的HangMen
文件中的另一个类中,该类名为App
。 .java
方法本质上是一种必不可少的弊端,它只是一种非面向对象的技巧,目的是要从冷酷的硬件,操作系统和命令行控制台世界中启动我们的面向对象的天堂。单独使用main
方法(基本上忽略它们)可以帮助学习Java。
main