是否有可能使用Java将类划分为多个物理文件?
答案 0 :(得分:32)
不,整个类必须在Java中的单个文件中。
如果您正在考虑C#的“部分类型”功能,那么Java中没有相应的功能。 (如果你没有想到C#,请忽略它:)
答案 1 :(得分:10)
如果这个类真的那么大,以至于实现的概念不容易掌握,这可能是一个好主意。我看到两种不同的方法:
使用继承:将类的一般概念移动到基类并从中派生专门的类。
使用聚合:将班级的某些部分移至单独的班级,并使用参考建立与第二班级的关系。
如前所述,Java中没有像部分类这样的概念,所以你必须使用这些OOP机制。
答案 2 :(得分:6)
仅使用javac
,这是不可能的。您当然可以将多个文件合并到一个.java文件中作为构建过程的一部分,然后调用javac
,但这在很多级别上都很麻烦,以至于它不太可能有用。
也许你可以解释一下你的问题,然后我们可以提供更好的帮助。
如果您觉得您的.java文件太大,您应该考虑重构。
答案 3 :(得分:4)
当然有可能,但我认为它根本没用。
首先,除了分数并不是我想的问题,你只需编译文件并按照你想要的方式将其拆分。
现在将它们重新组合在一起你需要做的就是编写一个自定义类加载器来加载所有部分,将它们组合成一个单字节数组,然后调用defineClass()
。
就像我说的,它确实看起来毫无意义,可能不是你想要的,绝对不是你需要的东西,但它在技术上是可行的。
(我曾经做过类似于混淆代码的开玩笑方式:类文件的字节分散在应用程序中所有其他类的常量中。很有趣,我不得不承认。)
答案 4 :(得分:2)
不,在Java中无法做到这一点。
答案 5 :(得分:2)
为了完整起见:
从Java 8开始,您就有了默认方法的概念。
您可以通过使用界面轻轻地 ab
将您的课程分为多个文件/子类观察:
interface MyClassPartA{
public default int myMethodA(){return 1;}
}
interface MyClassPartB{
public default String myMethodB(){return "B";}
}
并将它们结合起来
public class MyClass implements MyClassPartA, MyClassPartB{}
并使用它们:
MyClass myClass = new MyClass();
System.out.println(myClass.myMethodA());
System.out.println(myClass.myMethodB());
您甚至可以使用抽象的getter和setter在类/文件之间传递变量,而您需要在主类或父类中实现/覆盖它们。
答案 6 :(得分:1)
不,你不能。如果你的课程太大,你应该把它分成两个或更多。