为了账号安全,请及时绑定邮箱和手机立即绑定

Java-不可以访问foo类型的封闭实例

Java-不可以访问foo类型的封闭实例

倚天杖 2019-06-01 15:09:19
Java-不可以访问foo类型的封闭实例我有以下代码:class Hello {     class Thing {         public int size;         Thing() {             size = 0;         }     }     public static void main(String[] args) {         Thing thing1 = new Thing();         System.out.println("Hello, World!");     }}我知道呀Thing什么也不做,但我的你好,世界程序编译只是很好没有它。只有我定义的类在我身上失败了。它拒绝编译。我得到No enclosing instance of type Hello is accessible."在创造新事物的那条线上。我猜要么是:我有系统级别的问题(无论是在DrJava中还是在我的Java安装中),或者对于如何用java构建一个工作程序,我有一些基本的误解。有什么想法吗?
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

static class Thing会让你的计划运转起来。

事实上,你有Thing的内部类,该类(根据定义)与Hello(即使它从不使用或引用它),这意味着这是一个错误的说法new Thing();没有特别的Hello例如在范围内。

如果您将它声明为静态类,则它是一个“嵌套”类,它不需要特定的Hello举个例子。


查看完整回答
反对 回复 2019-06-01
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

你已经宣布了这门课Thing作为一个非静态的内部类。这意味着它必须与Hello班级,等级。

在您的代码中,您试图创建一个Thing从静态的上下文中。这正是编译器所抱怨的。

有几种可能的解决办法。使用哪种解决方案取决于您想要实现什么。

  • 移动Thing走出Hello班级,等级。

  • 变化Thing成为static嵌套类

    static class Thing
  • 创造实例Hello在创建Thing.

    public static void main(String[] args){
        Hello h = new Hello();
        Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P}

最后的解决方案(a非静态的任何实例时,嵌套类)都是强制性的。Thing依赖于Hello才有意义。例如,如果我们有:

public class Hello {
    public int enormous;

    public Hello(int n) {
        enormous = n;
    }

    public class Thing {
        public int size;

        public Thing(int m) {
            if (m > enormous)
                size = enormous;
            else
                size = m;
        }
    }
    ...}

创建类对象的任何原始尝试Thing,见:

Thing t = new Thing(31);

会有问题,因为不会有明显的enormous值来测试31。实例h.的.Hello外部类是提供以下内容所必需的h.enormous价值:

...Hello h = new Hello(30);...Thing t = h.new Thing(31);...

因为这并不意味着Thing如果它没有Hello.

有关嵌套/内部类的更多信息:嵌套类(Java教程)


查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 889 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号