【问题标题】:How to reference local class如何引用本地类
【发布时间】:2018-08-23 14:46:45
【问题描述】:

我有一个本地课程...

public class Outer {
    public void wrapper() {
        class Local {
        }
    }
}

而且我有一个测试需要引用本地类...

Outer.wrapper.Local.class ## this doesn't seem to work

如何引用本地类?

【问题讨论】:

  • 只是不要在函数中声明类。
  • 你不能。该类只存在于函数的范围内。
  • 本地类就是他们的名字所说的:本地。他们不能被推荐到外面
  • @Lino“不能在外面使用”并不完全正确:比如说,你可以返回本地类的一个实例,然后做......随便。但是你不能通过名字来引用那个类。
  • @AndyTurner 这就是我真正的意思,抱歉。将评论更改为参考

标签: java local-class


【解决方案1】:

您只能在声明它的方法中引用本地内部类:

public void wrapper() {
  class Local {

  }
  Local obj = new Local();
}

由于范围有限,这些类往往不是很有用。如果您找到了一个有效的用例来定义一个,请查看at this tutorial

【讨论】:

  • 所以本地类是隐式 private.
  • @nobar JLS 14.3。本地类声明 禁止修饰符,因此编写 private class Local 会触发编译错误。我会说它们是他们自己的特殊面包。
  • @nobar 不,它们是本地的:它们与局部变量一样可访问(例如,在同一编译单元中可以访问私有类)。如果你想给它一个标签,那可能是“真的很私密”。
  • 根据JLS 14.3每个本地类声明语句都立即包含在一个块中”。使用这个措辞我会说它们是block private。但是“真的很私密”听起来更好:)
  • block private 是我想到的——或者封闭范围的私有,即块。
【解决方案2】:

本地类(又名本地内部类或方法本地内部类):

本地类被定义为方法中的内部类。与局部变量一样,局部内部类声明在方法调用之前不存在,并且在方法返回时超出范围。这意味着它的实例只能从它声明的方法中创建。

这个内部类只能在其定义之后被实例化(即,实例化代码必须跟在声明之后)。内部类无权访问方法的局部变量,除非这些变量是最终的或实际上是最终的。

这是一个例子:

int length = 10; // outer class's instance variable

public void calculate() {
    final int width = 20;
    class Inner { // inner class definition
        public void area() {
            System.out.println(length * width);
        }
    }
    Inner local = new Inner(); // this statement comes only after local class's definition
    local.area();
}

注意事项:

  • 唯一可以应用于方法局部内部类的修饰符 是抽象的和最终的,但绝不会同时存在。
  • 在静态方法中声明的本地类只能访问封闭类的静态成员,不能访问实例 变量。

【讨论】:

  • 这看起来像是从一些教程中复制和粘贴的,它甚至没有回答如何从方法外部访问该本地类的问题。
  • 答案帖子内容不是来自教程。这是我去年某个时候为 Java SE 8 认证考试准备的笔记。我用它来通过考试。答案显示了如何正确使用方法本地类以及需要考虑的几点。 OP 的问题是 我如何引用本地类? 而且,帖子的标题是 如何引用本地类
  • 我对从单独的测试类中引用本地类特别感兴趣。抱歉,如果我不清楚这一点。
  • @nobar 可以从另一个类引用一个内部类;但不是方法本地类。还有其他(非本地)类型的内部类需要考虑 - 常规内部类或静态嵌套类。
  • @nobar 这是指向 Oracle 的 Java 教程主题 Nested Classes 的链接。这包含有关嵌套类的一般详细信息,特别是每种类型的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2012-10-09
  • 2013-08-31
相关资源
最近更新 更多