我今天开始在Eclipse中编写一段代码,我开始是这样的:
public class MyClass {
System.currentTimeMillis();
}
(忽略我没有直接思考等事实......)
我收到了这个编译错误:
令牌“currentTimeMillis”上的语法错误,此令牌后预期的标识符
如果我将该语句更改为赋值语句,则可以正常工作:
long time = System.currentTimeMillis();
当然,如果放在方法体内并且也放在类体内的块内,它不会导致错误。
这是为什么?是否有一些编译器级规则表明只有赋值语句或声明应存在于类体内?
TIA
答案 0 :(得分:6)
类主体只能包含声明。
具体来说,§ 8.1.6 of the JLS定义了这样的类体:
类主体可能包含类成员的声明,即字段(§8.3),类(§8.5),接口(§8.5)和方法{{3 }}。类主体还可以包含实例初始值设定项(§8.4),静态初始值设定项(§8.6)以及类的构造函数(§8.7)的声明。
ClassBody: { ClassBodyDeclarationsopt }
ClassBodyDeclarations: ClassBodyDeclaration ClassBodyDeclarations ClassBodyDeclaration
ClassBodyDeclaration: ClassMemberDeclaration InstanceInitializer StaticInitializer ConstructorDeclaration
ClassMemberDeclaration: FieldDeclaration MethodDeclaration ClassDeclaration InterfaceDeclaration ;
如您所见,无论如何都没有声明,因此类主体可能不会直接包含声明。
如果您考虑一下,那就有意义了:该代码应该在哪个时刻执行?没有任何背景可以告诉你这一点,所以没有任何意义。
答案 1 :(得分:5)
这是非法的。在类体中,您只能拥有:块,字段,构造函数,方法和类
你的不是。那你还期望它做什么呢?如果希望在实例化类时执行它,则将其放在块中:
{
System.currentTimeMillis();
}
答案 2 :(得分:2)
尝试这种方式:
public class MyClass {
static {
System.currentTimeMillis();
}
}
如果在静态语句中调用System.currentTimeMillis(),则可以正常工作。 当类加载器加载类“MyClass”时,将调用静态块。
答案 3 :(得分:1)
是否有一些编译器级规则表明只有赋值语句或声明应存在于类体内?
总之:是的。在类主体级别,您可以拥有实例和静态成员变量声明,方法声明,嵌套类,对象初始化块,静态初始化块和注释。根据定义,就是这样。
语言的“编译器级规则”称为语法。
答案 4 :(得分:1)
您需要从方法内部调用代码,而不仅仅是单独调用代码。 E.g。
public class MyClass {
public static void main(String[] args)
{
System.currentTimeMillis();
}
}
以上仍然不会做任何事情,但这是合法的: - )
答案 5 :(得分:1)
是否有一些编译器级规则 说只有作业陈述 或声明应该存在 在班级内部?
是。更具体地说,编程语言的句法规则通常被定义为一种形式语法,它规定了语法正确的程序是如何形成的。在这种情况下,Java language specification说:
ClassBody:
{ ClassBodyDeclarationsopt }
ClassBodyDeclarations:
ClassBodyDeclaration
ClassBodyDeclarations ClassBodyDeclaration
ClassBodyDeclaration:
ClassMemberDeclaration
InstanceInitializer
StaticInitializer
ConstructorDeclaration
由于静态方法调用不是ClassMemberDeclaration
,InstanceInitializer
,StaticInitializer
和ConstructorDeclaration
之一,因此不允许它直接存在于类体内。
答案 6 :(得分:0)
long time = System.currentTimeMillis();
是一个实例变量,它在创建封闭对象时被初始化为当前时间。的有效强>
System.currentTimeMillis();
是一个独立的声明。 无效,包含构造函数,方法,静态iniatilizer等。
答案 7 :(得分:0)
你没有得到行
的错误long time = System.currentTimeMillis();
因为您在类中指定了一个私有变量(很长时间)并将它们设置为默认值(System.currentTimeMillis())所以当您创建类 MyClass 的新实例时,变量正在被实例化。
只调用System.currentTimeMillis()只有nosense,因为你没有做任何事情(既没有上下文也没有将值赋给私有变量)