一个简单的测试程序出现错误:"类型test的封闭实例不可访问。必须使用类型test的封闭实例限定分配方式"。

6

我遇到了“找不到类test的封闭实例,必须用test类型的封闭实例来限定分配”错误,代码如下:Location ob1 = new Location(10.0, 20.0); 我不确定为什么会出现这种情况。

package pkg;

public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Location ob1 = new Location(10.0, 20.0);
        Location ob2 = new Location(5.0, 30.0);
        ob1.show();
        ob2.show();
        ob1 = ob1.plus(ob2);
        ob1.show();
        return;
    }

    public class Location // an ADT
    {
        private double longitude, latitude;

        public Location(double lg, double lt) {
            longitude = lg;
            latitude = lt;
        }

        public void show() {
            System.out.println(longitude + " " + latitude);
        }

        public Location plus(Location op2) {
            Location temp = new Location(0.0, 0.0);
            temp.longitude = op2.longitude + this.longitude;
            temp.latitude = op2.latitude + this.latitude;
            return temp;
        }
    }
}

1
请查看此帖子 - https://dev59.com/GXVD5IYBdhLWcg3wJIIK - Rohit Jain
你是否打算将 Location 创建为嵌套类? - pamphlet
1
我建议你将Location类移出test。它似乎与之无关。这是有意为之吗? - Rohit Jain
为了测试和学习目的,我遇到了与您相同的情况,其中一种解决方案是将类放在单独的文件中。但是,如果您仍然想要这样的内部类 - 您应该将其设置为静态。 - Combine
4个回答

11
尝试
Location ob1 = new test().new Location(10.0, 20.0);
Location ob2 = new test().new Location(5.0, 30.0);

首先需要创建外部类的实例,然后才能创建内部类的实例。


1
Location 变成一个静态嵌套类不是更容易吗? - Boris the Spider
这可能可以解决问题,但很可能不是原帖作者所需要的解决方案。 - pamphlet
将位置移至测试之外(或)将其创建为静态的会更好,我希望他能理解为什么他遇到了他提到的错误。 - upog
1
Location的写法应该是一个静态嵌套类,因为它似乎是独立存在的,并且没有引用任何test对象。我能想到的唯一原因是(1)他计划稍后添加会引用test对象的内容,或者(2)老师告诉他必须这样做。(是的,学习如何处理内部类很重要。) - ajb

7
你可以考虑将它们分成两个文件。看起来你的意图不是创建嵌套类,而是让一个测试类调用你的核心类。
文件#1:Test.java
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Location ob1 = new Location(10.0, 20.0);
        Location ob2 = new Location(5.0, 30.0);
        ob1.show();
        ob2.show();
        ob1 = ob1.plus(ob2);
        ob1.show();
        return;
    }
 }

File #2: Location.java

public class Location // an ADT
{
    private double longitude, latitude;

    public Location(double lg, double lt) {
        longitude = lg;
        latitude = lt;
    }

    public void show() {
        System.out.println(longitude + " " + latitude);
    }

    public Location plus(Location op2) {
        Location temp = new Location(0.0, 0.0);
        temp.longitude = op2.longitude + this.longitude;
        temp.latitude = op2.latitude + this.latitude;
        return temp;
    }
}

当你在单个java文件中定义多个类时,你会在它们之间创建依赖关系,这样就会出现“类型的封闭实例”错误。在你的代码中,Test 封装了Location。这些是嵌套类,除非你有很好的设计理由写你的类这样,否则最好还是遵循一个文件一个类的方式。

1
值得注意的是,内部类仍然可以声明为静态的。在这种情况下,Location仍然可以是test的(静态)内部类,并且仍然可以正常工作。当Location移动到任何类之外时,默认情况下被认为是静态的。 - user118967

0

我对Java非常新手,但我找到了解决这个问题的方法。问题在于括号的错误封闭。

package pkg;

public class test {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Location ob1 = new Location(10.0, 20.0);
    Location ob2 = new Location(5.0, 30.0);
    ob1.show();
    ob2.show();
    ob1 = ob1.plus(ob2);
    ob1.show();
    return;
}
}

public class Location // an ADT
{
    private double longitude, latitude;

    public Location(double lg, double lt) {
        longitude = lg;
        latitude = lt;
    }

    public void show() {
        System.out.println(longitude + " " + latitude);
    }

    public Location plus(Location op2) {
        Location temp = new Location(0.0, 0.0);
        temp.longitude = op2.longitude + this.longitude;
        temp.latitude = op2.latitude + this.latitude;
        return temp;
    }
}

花括号并不是问题的关键。在原始帖子中,位置被定义为test的内部类,但没有被标记为静态。类的非静态成员必须与该类的实例一起使用。例如,如果我有一个具有静态方法print的类Foo,我可以调用Foo.print(),但如果该方法不是静态的,那么我必须调用: Foo f = new Foo(); f.print()。 因此,在main函数中不能在没有test实例的情况下使用Location。当您将Location移出test时,则Location未在任何其他类中定义,并且默认情况下被视为静态。 - user118967

0

有几种解决方案可以修复这个错误:

  1. 如前所述 - 将两个类放在不同的文件中

  2. 将您的内部类也设置为静态

        public static class Location { ... }
    
  3. 假设这仅用于测试/学习目的,并且您想要修复错误 - 您可以像这样调用'Location'类。提到这种情况是因为它说明了错误的根源 - 如果类不是静态的,就像在原始问题中一样 - 您必须从父类创建一个对象才能访问内部类。但是,除非您有特殊原因编写此方式,否则修复1,2更好。

    Location ob1 = new test().new Location(10.0, 20.0);
    Location ob2 = new test().new Location(5.0, 30.0);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接