访问不存在的类中的类

时间:2014-07-04 22:41:17

标签: java

这是如何运作的?

编辑:静态不是一个很好的解释,因为我可以使用非静态方法,它将全部工作。更新了代码以反映出来。

我在一个名为Foo.java的文件中有这个:

// This is in the Foo.java file
class Test {
    public void printSomething() {
        System.out.println("In Foo.Test");
    }
};

这是一个名为Caller.java的文件:

// This goes in the Caller.java file
public class Caller {
    public static void main(String[] args) {
        Test test = new Test();
        test.printSomething();
    }
}

我可以执行我的来电,它会打印In Foo.Test。这怎么可能不是编译问题?我甚至没有创建Foo课程。我甚至不必在Foo.Test中定义Caller

这是关于Eclipse Luna,Java8。

3 个答案:

答案 0 :(得分:1)

一个java文件可以包含单个 public 类,但它可以包含任意数量的非公共类(在您的情况下为package-local)。

Foo.Test用于内部类。您声明的是top level type.

答案 1 :(得分:1)

main - Foo.java的方法被声明为静态

调用静态方法可以在不创建类的对象的情况下工作。

例如,您可以在Foo.java

中创建以下方法
class Test {
    public static void test(String test) {
        System.out.println(test);
    }
};

现在您可以致电Test.test("No object will be created");,并且不会有Test

的实例

答案 2 :(得分:1)

Java很奇怪。您可以拥有一个没有任何代码行的文件,它仍然可以编译。继续尝试吧。

现在,我认为你把测试与Foo.Test混淆了(我明白,这是星期五)。

本质上你所定义的是:

public class Foo {} // this is by default, but don't try to use it because you didn't define the scope
class Test {}

你的困惑是" OMG,Test是一个不存在的阶级的不纯的后代!!!",因为你期待像

public class Foo {
    class Test {}
}

这与静态方法无关。它与javac中的怪癖有关。

大家周五开心!欢乐时光。