当前位置: 首页 > 面试题库 >

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());
    }
}

谢谢。


问题答案:

更新2014年2月9日:

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。 本地班级限制

本地课程受以下限制:

  • 本地类仅在定义它的块内可见;它永远不能在该块之外使用。

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

  • 类似于成员类,并且出于相同的原因,局部类不能包含静态字段,方法或类。唯一的例外是声明为static和final的常量。

  • 接口不能在本地定义。

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

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

因此,如您所见,在这些情况下,首选第一个选项(无嵌套方法)。



 类似资料:
  • 这是我的密码。 我可以这样做吗? 谢谢你。

  • 问题内容: 我想知道是否有任何方法可以在Java中实现。我认为,如果没有本地对闭包的支持,这是不可能的。 问题答案: Java 8(2014年3月18日发布)不支持curring。可以将Missingfaktor在答案中发布的示例Java代码重写为: …这是非常好的。就个人而言,有了Java 8,我几乎没有理由使用替代的JVM语言(例如Scala或Clojure)。当然,它们提供了其他语言功能,但

  • 问题内容: Java是否有C ++的类似物: 我需要使用自己的数据类型。 问题答案: Java绝对没有结构:)但是,您在此处描述的内容看起来像JavaBean类。

  • 我可以在hive和impala中使用基于java的UDF,但是在子句中调用UDF时抛出错误 当在条款中引用时,UDF不能使用,但当它仅在后面引用impala 2.9.0-cdh5时,UDF可以正常工作。12.1 在hive工作正常,但在impala中不工作。 在impala中执行是可以的。UDF只能在impala中使用,不能在子句中使用 这里是错误 在子句中用impala引用UDF是可能的吗?

  • 在Craft CMS中使用这个细枝代码,我得到如下所示的错误。Craft CMS的制造商告诉我,小枝“date”不支持像“janvier 2016”这样的本地化月份名称,但英文“janvier 2016”也可以。 这是真的吗? 我的小枝:{%set queryStartDate=date([month,year]| join(“”))%} 错误:DateTime::_construct():无法分

  • 问题内容: 我很困惑。我以为Java 8将会从石器时代诞生并开始支持lambda / closures。但是当我尝试这个: …说。恩,我想不是闭包。听起来好像是通过值而不是通过引用复制环境。 奖金问题! Android是否支持Java 8功能? 问题答案: 为什么,为什么,Java。为什么哦为什么。 您需要与相关的Oracle Java团队成员进行长时间的(私人)讨论,以获得真正的答案。(如果他们