Java中类定义和声明的独立文件 我是一个C++程序员,目前正在学习java,我想知道java中的OOP是否遵循C++定义的类定义和声明的分离原理,即把它们放在单独的文件中。我已经浏览了互联网,包括Android开发者网站,我遇到的所有代码都同时进行了定义和声明 这只是C++中的开发与java开发之间的区别之一,还是我一直在寻找的那些简单的方法来限制他们在互联网上发布代码的复杂性?在一些C++文档中,我看到了一些声明和定义,虽然我知道这样做是不好的。 < P> 下面的答案已经根据注释进行了大量编辑。>P/>
您不需要纯粹为了编译器而将类拆分为定义和声明,因为在Java中不需要前向声明(就像在C++中一样)。由于设计要求,您可能希望将类定义和声明拆分为接口/类对(或[抽象]类/类对),例如:Java中类定义和声明的独立文件 我是一个C++程序员,目前正在学习java,我想知道java中的OOP是否遵循C++定义的类定义和声明的分离原理,即把它们放在单独的文件中。我已经浏览了互联网,包括Android开发者网站,我遇到的所有代码都同时进行了定义和声明 这只是C++中的开发与java开发之间的区别之一,还是我一直在寻找的那些简单的方法来限制他们在互联网上发布代码的复杂性?在一些C++文档中,我看到了一些声明和定义,虽然我知道这样做是不好的。 < P> 下面的答案已经根据注释进行了大量编辑。>P/>,java,oop,Java,Oop,您不需要纯粹为了编译器而将类拆分为定义和声明,因为在Java中不需要前向声明(就像在C++中一样)。由于设计要求,您可能希望将类定义和声明拆分为接口/类对(或[抽象]类/类对),例如: 实现单个接口的多个类 远程过程调用,您不想公开任何类依赖项(因为它们在客户端可能不可用) 类,但您在测试时不需要/不想要它的全部功能(例如,您可能希望在测试代码中模拟的数据库访问服务) 但是,这更类似于使用虚拟基类和C++中具体实现类,通常称为“编程到接口”。您可以阅读有关该技术的更多信息(这里有一些参数,说
- 实现单个接口的多个类
- 远程过程调用,您不想公开任何类依赖项(因为它们在客户端可能不可用)
- 类,但您在测试时不需要/不想要它的全部功能(例如,您可能希望在测试代码中模拟的数据库访问服务)
因此,简短的回答是:您不需要仅为了进行前向声明而拆分类(原始问题是这样问的),尽管如果有设计原因,您可能会这样做(但这并不等同于C++的头文件/类文件拆分)。在Java中,一个文件中有一个类,也就是说,你不能——也不需要——在多个文件上拆分类(但你可以在一个文件中有多个非公共类)
您可以使用接口,即在一个文件中为类定义接口,并在另一个文件中的类中实现该接口。如果你只分发API,你只需分发接口。 < P>在java中没有头和源文件,就像C++中的一样。如果要将类声明与其实现分离,可以定义一个声明方法的接口,然后创建一个实现该接口的类。您所写的分离在Java中不存在。在Java中,您可以将方法定义(非静态定义)分离到一个
接口,您别无选择:类名链接到文件名。对于源文件根目录中名为x/y/z/T.java
的文件,T.java
必须如下所示:
package x.y.z;
[some modifiers here] class T {
// class T here
}
有很多方法可以将“类定义”与“实现”区分开来,最接近您的想法是声明一个接口I
,并拥有一个类C
实现I
。也要考虑抽象类。
接口具有完全相同的约束,只是声明了接口
而不是类
。抽象类只是一个带有abstract
修饰符的类。不,java中不存在这种分离。但是看看界面关键字。您可以显式声明接口 > C++中声明声明是有实际意义的,它是为了允许单独编译源文件。Java中没有这样的需求(因为所有的东西都被单独编译成字节码),所以这是不允许的。Java中有接口和它们的实现分离。每个人和接口都有什么关系?这绝对不是他们的目的。将单个类拆分为接口和实现是没有意义的:它们的存在是为了允许轻量级形式的多重继承,以描述可以单独实现的一般行为。这不同于C++对特定类的定义进行分离。当类“很重”并且您需要一种简单的方法(例如,为测试代码创建一个模拟)时,将单个类分离为接口和实现是非常有意义的。“当然,为非常简单的类这样做可能会有点过头。”维鲁佐同意。我们不需要每个类都有一个IMyClass和MyClassImpl;爪哇中类和接口的区别与C++中的头和定义之间的区别很小。+ 1:使用接口将契约与实现分开。- 1:如果需要MyService的多个实现,则有理由;否则,它是不成熟的抽象(这是许多罪恶的根源)(对于编辑而言),但这种行为与C++的纯抽象类相当,仍然与声明分离没有直接关系。要知道,这里争议的主要来源是“实现类似功能”部分:这些功能没有直接关系@AndrewSpencer即使您只有一个实现,引入一个接口也是很有用的,例如,当实现具有一些用户不需要导入的依赖项时。例如,如果我有一个依赖于Spring的远程服务,那么客户端不必导入Spring就可以调用该服务。所需要的只是接口和对远程服务器的依赖关系