Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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_Methods - Fatal编程技术网

java中的方法可以嵌套吗?效果如何?

java中的方法可以嵌套吗?效果如何?,java,methods,Java,Methods,例如,这是否合法: class NAME { method { method {} } } 那会有什么影响呢?有没有特别的语法 这是无效的语法;不支持此类功能。(尽管正在考虑使用Java 7) 相反,您可以使用嵌套类,而无需进行检查。编译器不接受这种情况,因为此时需要在类中定义方法。但是,您可以在方法内部定义一个内部类(请参阅“本地和匿名内部类”) 没有 一种解决方案是将要调用的方法声明为“parent”方法之外的私有方法——如果您真的感到麻烦,可以使用一些命名约定来指示它们“属

例如,这是否合法:

class NAME {
method {
     method {} 
}
} 

那会有什么影响呢?有没有特别的语法

这是无效的语法;不支持此类功能。(尽管正在考虑使用Java 7)


相反,您可以使用嵌套类,而无需进行检查。

编译器不接受这种情况,因为此时需要在类中定义方法。但是,您可以在方法内部定义一个内部类(请参阅“本地和匿名内部类”)

没有

一种解决方案是将要调用的方法声明为“parent”方法之外的私有方法——如果您真的感到麻烦,可以使用一些命名约定来指示它们“属于”该“parent”方法

您可以考虑的另一件事是,您可以声明任意作用域块并对其进行标记,然后使用break来打破该块,这一点在程序员中似乎并不广为人知

因此,以下内容完全合法:

void method() {
      myInnerMethod : {
        // do some stuff

        if (condition) {
            break myInnerMethod;
        }

        // do some more stuff
      }
}

当然,作用域块并不是一个真正的方法,但在某些情况下,它可以用来做你想要的“内部方法”的事情。

在Java中不被接受。看起来您想要执行递归,只需再次调用相同的方法

method(){

  method();

}

否。这是无效的语法。这是一个遗憾——这是我从Ada那里错过的事情之一。如果不能定义嵌套方法,那么在使用大量私有方法组织类时会产生很多问题。从那里开始,这是一个滑向缺乏凝聚力土地的滑坡

您可以使用嵌套类,但它们是有代价的。每个嵌套类生成一个$named类。每一个都有打开的文件句柄(如果不是从存档中提取)以及其类定义占用的内存方面的代价。一些系统对它们可以部署的文件数量(因此生成的类总数)有一个上限(例如谷歌应用程序)

换句话说,我不会使用嵌套类来模拟嵌套方法(以防您决定尝试这种方法)

现在,假设您可以使用嵌套方法(如在Ada中),那么这些方法将只在封闭方法中可见(它们比典型的私有方法更受限制)。它们将能够看到在外部范围中定义的变量和参数(但可能只有在定义为final时)

它将允许您在嵌套的名称空间中组织方法和算法。当智能地使用时,嵌套方法确实有助于组织代码。

UPDATE 由于Java8方法可以使用lambdas进行嵌套,请参阅

这个答案对于Java8之前的Java版本有效

原答覆如下:

java中的方法是否可以嵌套[…]

不,那是不可能的

你能得到的最接近的东西是:

class Name {
    void methodOne() {
        class InnerClass {
           void methodTwo() {
           }
         }
     }
 }
即,在方法中定义的内部类中定义的第二个方法



您可以在内部类中声明静态方法,这样就不必调用
new

无效的东西!我冒着投反对票的风险:你在找什么?就这么多票?这个问题是关于什么的?你想达到什么目的?@EJP,只有编译器的答案是肯定的,编译器才会给我正确的答案。我可以尝试一下,但它不能工作,但语法可能是错误的,我可能是在错误。没有办法知道。对不起,那是一个毫无意义的狡辩。你问这是否合法。编译器的回答要么是否定的,要么是肯定的。如果我试一下,编译器说“不”,它可能不是“不”的意思。它的意思可能是“不”或“你有语法错误”。编译器能给我一个明确答案的唯一条件是如果它说是的,并且一切都按照我的预期进行。对,但我不知道,在这种情况下,编译器给我的错误是由于语法错误还是缺少功能。考虑神话编程语言X。如果我试图写“int b=43”,它给了我一个错误,那么两个事情中的一个是正确的:EAH 1)我有语法错误或2)x不支持整型变量。我无法从错误的存在中知道这些案例中哪一个是正确的。因此,如果编译器说“不”,它可能意味着“不”,也可能意味着“错误”。我想他们的意思是在另一个方法中定义一个方法,而不是递归。@Neil:我想他不知道自己的意思。;)然而,你可能是对的。+1,我从来不知道,但我只是验证了它。。。我想你不能称之为障碍,但正如上面指出的,你可以跳到它。(不确定此功能的用途,待定。)@Edmund您不能跳转到带标签的块。你只能从中挣脱出来。这就使得它们几乎没有什么用处了。@Stephen--谢谢你的更正。我从来没有使用过带标签的分隔符,我认为它们的意思是“断开这个标签”,而不是“断开这个标签”。它们不是很有用,但有时它们很有用,否则一个方法将是最符合逻辑的解决方案(想象一个包含例如循环的方法,并且您希望从循环中的方法返回)。如果你仔细看的话,JDK源代码中有一两个示例。有没有办法在任何方法中一次性重用它们?特别是本地内部类。Java 7已经过时了,不包括嵌套方法。也许Java8.Java8已经过时了,并且不包括嵌套方法。也许是Java 9。@Oli:没有;Java 8有lambda。@SLaks lambda不是编译时嵌套的方法,例如Scala有,这个问题也提到了。您必须删除内部类声明中的括号:
class InnerClass{
是的,这是一个旧的、封闭的操作,但是为了读者的缘故,您不能在内部类中声明静态成员,因为它们需要外部类的实例。您不能避免使用新的运算符。Java 8为此提供了很好的语法糖。