当前位置: 首页 > 知识库问答 >
问题:

Java支持内部/本地/子方法吗?

公西俊能
2023-03-14

这是我的密码。

public class SubFunction {
    private String drawTribleX(){
        return trible("X");
    }
    private String trible(String t){
        return t + t + t;
    }
    public static void main(String[] args){
        SubFunction o = new SubFunction();
        System.out.println(o.drawTribleX());
    }
}

我可以这样做吗?

public class SubFunction {
    private String drawTribleX(){
        // *** move trible(t) inside drawTribleX() ***
        private String trible(String t){
            return t + t + t;
        }
        return trible("X");
    }
    public static void main(String[] args){
        SubFunction o = new SubFunction();
        System.out.println(o.drawTribleX());
    }
}

谢谢你。

共有3个答案

支劲
2023-03-14

你也可以用这种方式尝试匿名内部类。

public class SubFunction {
    private String drawTribleX() {
        // *** move trible(t) inside drawTribleX() ***
        Trible t = new Trible() {
            public String trible(String t) {
                return t + t + t;
            }
        };
        return t.trible("X");
    }

    public static void main(String[] args) {
        SubFunction o = new SubFunction();
        System.out.println(o.drawTribleX());
    }

    interface Trible {
        String trible(String t);
    }
}
籍星汉
2023-03-14

很简单-不。您不能将一个方法嵌套在另一个方法中。

如果你真的想这样做,你可以在方法中定义类(奇怪的是,考虑到前面的限制),这样你就可以在外部方法中的类中包装你的方法。

然而,这并不是很惯用,一般的做法似乎是有一个私有方法列表(在顶级类中),可能根据目的进行分组,并用注释块划分组。

然而,如果你碰巧发现自己在使用Scala,你可以尽情地嵌套方法...

白文彬
2023-03-14

更新2014-02-09:

JDK 8引入了lambdas(匿名函数表达式),它允许您这样解决它:

Function<String, String> trible = s -> s+s+s;
System.out.println(trible.apply("X"));           // prints XXX

(JDK 7及以下版本)

不,Java不支持直接嵌套方法。(大多数函数语言都支持,包括一些JVM语言,如Scala和Clojure!)

不过仅供参考;您可以定义本地类(方法中的类),这样就可以编译

class SubFunction {
    private String drawTribleX(){

        // *** move trible(t) inside drawTribleX() ***
        class Trible {
            private String trible(String t){
                return t + t + t;
            }
        }

        return new Trible().trible("X");
    }
    public static void main(String[] args){
        SubFunction o = new SubFunction();
        System.out.println(o.drawTribleX());
    }
}

但是请注意,本地类有一些限制

3.11.2. 对本地课程的限制

本地课程受以下限制:

>

  • 局部类仅在定义它的块内可见;它永远不能在那个街区外使用。

    本地类不能声明为公共、受保护、私有或静态。这些修饰符用于类的成员;它们不允许与局部变量声明或本地类声明一起使用。

    像成员类一样,出于同样的原因,局部类不能包含静态字段、方法或类。唯一的例外是声明为静态和最终的常量。

    接口不能在本地定义。

    与成员类一样,本地类不能与其任何封闭类具有相同的名称。

    如前所述,局部类可以使用其范围内的局部变量、方法参数,甚至异常参数,但前提是这些变量或参数被声明为final。这是因为本地类实例的生命周期可能比定义该类的方法的执行时间长得多。因此,一个局部类必须有它使用的所有局部变量的私有内部副本(这些副本由编译器自动生成)。确保局部变量和私有副本始终相同的唯一方法是坚持局部变量是最终变量。

    因此,正如您所见,在这些情况下,您的第一个选项(没有嵌套方法)更可取。

  •  类似资料:
    • 问题内容: 这是我的代码。 我可以做这样的事情吗? 谢谢。 问题答案: 更新2014年2月9日: JDK 8 引入了lambdas(匿名函数表达式),您可以像这样解决它: (JDK 7及更低版本) 不,Java不支持“直接”嵌套方法。(尽管大多数功能语言都支持,包括一些JVM语言,例如Scala和Clojure!) 虽然仅供参考;你 可以 (方法中的类)定义局部类,所以这 确实 编译 请注意,尽管

    • 问题内容: 有什么方法可以访问Java中的本地内部类的方法。以下代码是我之前尝试过的示例代码。据此,访问该方法的机制是什么? 问题答案: 正如ILikeTau的评论所说,您无法访问在方法中定义的类。您可以在方法之外定义它,但是另一种可能性是定义一个(或抽象类)。这样,代码仍将位于您的方法内部,并且可以访问该方法中定义的变量和参数(如果将整个类移到外面,则无法执行此操作)。就像是: 注意: 未测试

    • 问题内容: 我试图在AngularJS中找到支持多种语言的文档,但没有成功。支持本地化吗? 问题答案: 看看angular-translate:https://github.com/angular-translate/angular- translate 对于所有DIY人士: 您可以找到角度的本地化文件:此处 这些文件将帮助您使用内置的角度过滤器:日期,货币和数字。太棒了…到目前为止。 现在,您想

    • 由于Linux系统的特殊性,G01对于Linux系统的支持主要以内核版本为主,即"uname -a"所显示的版本信息;而不以系统的版本信息为支持标准。 以下表格中为当前G01支持的Linux系统内核版本,安装时请进行参考。 CentOS/RedHat Linux 内核版本 CentOS 7/RedHat Linux 7 CentOS 6/RedHat Linux 6 CentOS 5/RedHat

    • 我尝试过为android设备实现刷卡方法,但此方法在Appium 1.3.4版本中不起作用。 下面是我写的代码: 并调用同一类中所需位置的。 它会抛出如下错误消息: org.openqa.selenium.WebDriverException:尚未实现。请帮助我们:http://appium.io/get-involved.html (警告:服务器未提供任何stacktrace信息)命令持续时间或

    • JUnit 5在运行时需要Java 8(或更高版本)。当然,您仍然可以测试使用以前版本的JDK编译的代码。