Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java中定义方法时返回类型的顺序很重要?_Java_Syntax - Fatal编程技术网

为什么在Java中定义方法时返回类型的顺序很重要?

为什么在Java中定义方法时返回类型的顺序很重要?,java,syntax,Java,Syntax,很好。为什么顺序在定义方法时起着重要作用? 为什么java希望在这里使用volatile关键字?重要的是,返回类型(void在本例中)必须始终位于方法名称之前,然后关键字必须位于返回类型之前,但kewords的顺序并不重要 例如,所有这些方法的声明都是有效的: public void static final finalMethod() { //This throws error saying "Syntax error on token //"

很好。为什么顺序在定义方法时起着重要作用?
为什么java希望在这里使用volatile关键字?

重要的是,返回类型(
void
在本例中)必须始终位于方法名称之前,然后关键字必须位于返回类型之前,但kewords的顺序并不重要

例如,所有这些方法的声明都是有效的:

public void static final finalMethod()
{ 

//This throws error saying "Syntax error on token                       
//"void", volatile expected"

}

public static final void finalMethod()
{

} 

因为它就是这样设计的

编译不仅仅是魔术。它解析代码,必须遵循特定的语法才能正确解释代码

语法就是语法,就是这样

制定规则是为了强制执行。语法很像规则。他们必须被跟踪


我不能像规范一样深入讨论这个问题,因为我不是java程序员。我编写了C#,但上面的代码适用于大多数编译语言。

因为语言规范这么说

看哪一个给出语法

public static final void finalMethod0() {

}

public final static void finalMethod1() {

}

final public static void finalMethod2() {

}

final static public void finalMethod3() {

}

static public final void finalMethod4() {

}

static final public void finalMethod5() {

}

根据您的问题,您将类型放在所有关键字的中间。您必须通过以下方式指定它们:

MethodDeclaration:
  {MethodModifier} MethodHeader MethodBody

MethodHeader:
  Result MethodDeclarator [Throws] 
  TypeParameters {Annotation} Result MethodDeclarator [Throws]

MethodDeclarator:
  Identifier ( [FormalParameterList] ) [Dims]
(){}
至于为什么会这样,我想说的是“事情就是这样的”。

请参阅方法声明

方法声明: MethodHeader方法体

MethodHeader: MethodModifiersopt类型参数Sopt结果MethodDeclarator Throwsopt

MethodDeclarator: 标识符(FormalParameterListopt)


您可以交换修饰符,但返回类型必须在函数旁边

例如:

<keywords> <type> <name>(<arguments>) {}
两者都是一样的

                public static void main(String args[]){
                }  

语法的定义方式(许多答案都指出)是:

  • 确保Java编译器(和其他更简单的代码分析工具)能够明确、快速地解释您的声明
  • 确保这一点在以后的语言发展过程中也是正确的
  • 想象一下,我们生活在一个
    静态
    关键字还没有发明的世界里,当像当前给出语法错误的那样重新排序是有效的时候。然后,可以说,
    static
    可能是Java类型的有效名称(如
    int
    String
    )。因此,当某个天才最终发明了关键字
    static
    ,一个声明如下:

                    static public  void main(String args[]){
                    }
    

    可能不明确:
    是静态的
    类型还是关键字?通过要求返回类型紧跟在函数名之前,这种语言更适合未来。Java语言扩展可以继续发明关键字,知道在声明中的返回类型之前插入关键字是安全的。

    因为这就是语法!太长,读不下去了修饰符是与返回类型不同的单独产品。
    public synchronized volatile final static strictfp transient void kill_me()
    这里的关键点是,通过要求类型紧跟在方法名称之前,Java的更高版本可以发明额外的关键字。当前的排序确保像static这样的关键字永远不会与返回类型混淆。@joeln你是对的,但我认为,即使使用新关键字,甚至使用在方法名称之前强制返回类型的语法,创建以关键字名称命名的类也永远是不合法的。@joeln你在编造它。一个新关键字要么是关键字,要么不是关键字。如果它是一个关键字,那么它是明确的,period.downvoter,是否需要详细说明?相当肯定有人只是批量downvoted你是对的,这就是为什么一个抛出错误,而另一个不抛出错误,但你不应该认为这样的语法约束本质上是必要的。还有其他语法更自由的语言。@joeln,比如。。。?此外,我使用的术语最多,而不是all@Rogue除了利用漏洞,这里没有“大规模否决”这类东西。如果
    static
    成为一个新的关键字,那么新语言无论如何都是完全明确的。
    MyType static Foo() {
        ...
    }