方法调用Java类

时间:2011-05-27 10:51:27

标签: java

我今天开始在Eclipse中编写一段代码,我开始是这样的:

public class MyClass {
    System.currentTimeMillis();
}

(忽略我没有直接思考等事实......)

我收到了这个编译错误:

令牌“currentTimeMillis”上的语法错误,此令牌后预期的标识符

如果我将该语句更改为赋值语句,则可以正常工作:

long time = System.currentTimeMillis();

当然,如果放在方法体内并且也放在类体内的块内,它不会导致错误。

这是为什么?是否有一些编译器级规则表明只有赋值语句或声明应存在于类体内?

TIA

8 个答案:

答案 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

由于静态方法调用不是ClassMemberDeclarationInstanceInitializerStaticInitializerConstructorDeclaration之一,因此不允许它直接存在于类体内。

答案 6 :(得分:0)

long time = System.currentTimeMillis();

是一个实例变量,它在创建封闭对象时被初始化为当前时间。的有效

System.currentTimeMillis();

是一个独立的声明。 无效,包含构造函数,方法,静态iniatilizer等。

答案 7 :(得分:0)

你没有得到行

的错误
long time = System.currentTimeMillis();

因为您在类中指定了一个私有变量(很长时间)并将它们设置为默认值(System.currentTimeMillis())所以当您创建类 MyClass 的新实例时,变量正在被实例化。

只调用System.currentTimeMillis()只有nosense,因为你没有做任何事情(既没有上下文也没有将值赋给私有变量)