Java的:在一个文件中的多个类的声明Java的:在一个文件中的多个类的声明(Java: Multi

2019-05-09 04:05发布

在Java中,你可以在一个文件中定义多个顶级类,提供这些至多一个是公共的(见JLS第7.6节 )。 请参见下面的例子。

  1. 是否有此技术整洁名(类似于innernestedanonymous )?

  2. 所述JLS说,该系统可以执行这些次级类不能被限制referred to by code in other compilation units of the package ,例如,它们不能被看作是包专用。 那是真正的东西,Java实现之间的变化呢?

例如,PublicClass.java:

package com.example.multiple;

public class PublicClass {
    PrivateImpl impl = new PrivateImpl();
}

class PrivateImpl {
    int implementationData;
}

Answer 1:

我给这家技术(包括在一个源文件中多个顶级类)建议的名称将是“一团糟”。 说真的,我不认为这是一个好主意 - 我想在这种情况下使用嵌套类型来代替。 然后,它仍然很容易预测哪些源文件它在,我不相信有这种方法虽然官方用语。

至于这是否真正实现之间改变 - 我很怀疑,但如果你避免在第一时间做这件事,你永远需要照顾:)



Answer 2:

javac还没有积极阻止这一点,但它确实有一个限制,即几乎意味着你不会想从另一个文件是指一个顶级类,除非它具有相同的名称,因为它是在文件。

假设你有两个文件,Foo.java和Bar.java。

Foo.java包含:

  • 公共类Foo

Bar.java包含:

  • 公共类酒吧
  • 类巴兹

让我们也说,所有的类都在同一个包(和文件在同一目录)。

如果Foo.java指巴兹但并不妨碍我们尝试编译Foo.java会发生什么? 编译失败,这样的错误:

Foo.java:2: cannot find symbol
symbol  : class Baz
location: class Foo
  private Baz baz;
          ^
1 error

这是有道理的,如果你想想看。 如果Foo.java指巴兹,但没有Baz.java(或Baz.class),如何能的javac知道要寻找什么的源文件?

如果你不是告诉的javac编译Foo.java和Bar.java在同一时间,或者即使你以前编译Bar.java(离开Baz.class javac的地方可以找到它),那么这个错误消失。 这使得构建过程感觉非常不可靠和片状,但是。

由于实际的限制,这更像是“不从另一个文件是指一个顶级类,除非它具有相同的名称,因为它是在和你也指一类是在的命名相同的文件的文件同样的事情作为文件”是一种难以遵循,人们通常用更简单(虽然严格)的只是把一个顶级类中的每个文件惯例去。 这也是更好,如果你改变主意类是否应该公开与否。

有时候真的是一个很好的理由,为什么每个人都没有以特定方式的东西。



Answer 3:

我相信你只需拨打PrivateImpl它是什么:一个non-public top-level class 。 您也可以申报non-public top-level interfaces为好。

例如,其他地方SO: 非公有制顶级类 VS静态嵌套类

至于版本之间行为的变化,有什么事,在1.2.2“非常完美”的讨论。 但停在1.4 Sun的论坛工作: Java编译器-无法在一个文件中宣布非公开顶层类 。



Answer 4:

如你想这样你可以有许多类

public class Fun {
    Fun() {
        System.out.println("Fun constructor");
    }
    void fun() {
        System.out.println("Fun mathod");
    }
    public static void main(String[] args) {
        Fun fu = new Fun();
        fu.fun();
        Fen fe = new Fen();
        fe.fen();
        Fin fi = new Fin();
        fi.fin();
        Fon fo = new Fon();
        fo.fon();
        Fan fa = new Fan();
        fa.fan();
        fa.run();
    }
}

class Fen {
    Fen() {
        System.out.println("fen construuctor");

    }
    void fen() {
        System.out.println("Fen method");
    }
}

class Fin {
    void fin() {
        System.out.println("Fin method");
    }
}

class Fon {
    void fon() {
        System.out.println("Fon method");
    } 
}

class Fan {
    void fan() {
        System.out.println("Fan method");
    }
    public void run() {
        System.out.println("run");
    }
}


Answer 5:

1.Is有此技术整齐名(类似于内,嵌套的,匿名)?

多类单文件演示。

2. JLS说,该系统可以执行这些次级类不能被代码中的包,例如其他编译单元中提到的限制,它们不能被看作是包专用。 那是真正的东西,Java实现之间的变化呢?

我不知道有任何不具有限制 - 所有基于文件的编译器不会让你参考源代码类,在其中未命名相同的类名的文件。 (如果你编译多类文件,并把类的类路径上,那么任何编译器会发现它们)



Answer 6:

根据有效的Java第二版(项目13):

“如果一个包私人顶级类(或接口)的使用只有一个类,考虑使顶层类的私人嵌套类使用它的唯一的类(22项),这降低了其所有的无障碍类在其包中使用它的一个类,但它更重要的是减少一个无偿公共类比包私人顶级类的可访问性:......“

嵌套类可以是静态的或非静态基于成员类是否需要访问外围实例(项目22)。



Answer 7:

当然可以,与外部公共类的公共静态成员,就像这样:

public class Foo {

    public static class FooChild extends Z {
        String foo;
    }

    public static class ZeeChild extends Z {

    }

}

而另一个文件引用上面:

public class Bar {

    public static void main(String[] args){

        Foo.FooChild f = new Foo.FooChild();
        System.out.println(f);

    }
}

把它们放在同一个文件夹。 编译:

javac folder/*.java

并运行:

 java -cp folder Bar


Answer 8:

不,你不能。 但它很可能在斯卡拉:

class Foo {val bar = "a"}
class Bar {val foo = "b"}


文章来源: Java: Multiple class declarations in one file
标签: java class