我正尝试在Java中创建一个n体模拟器,同时也学习OOP。Java OOP - 物理引擎类型
我想有一个包含所有物理常数和物理公式文件,我想计算力等时,在其他班级使用这些
如果这个文件是一个普通班的所有变量静态的,一个接口或一个抽象类,还是其他的东西?我对所有的定义都很困惑。
我正尝试在Java中创建一个n体模拟器,同时也学习OOP。Java OOP - 物理引擎类型
我想有一个包含所有物理常数和物理公式文件,我想计算力等时,在其他班级使用这些
如果这个文件是一个普通班的所有变量静态的,一个接口或一个抽象类,还是其他的东西?我对所有的定义都很困惑。
在你的情况下,我会创建一个名为Physics
或类似的东西。正如JayC667指出的那样,通过创建静态方法和静态变量,您可以完成所有您想要做的事情。它应该是这个样子:
public class Physics {
public static final int GRAVITY_ACCELERATION = 9.58;
public static double formula(double x, double y) { ... }
// etc.
}
然后,利用来自一个不同的这个类,你只需简单地引用变量和使用像这样的方法:
System.out.println("Acceleration of Gravity = " + Physics.GRAVITY_ACCELERATION);
double speed = Physics.formula(23.5, 840);
您可以使用接口强制类(实现这些接口)具有已定义的方法(在接口中定义),您可以确保基本功能,而所有类在所有其他方面可以完全不同。
在一个接口中,您只定义了方法签名(返回值,名称,参数类型)。这些纯粹是抽象的。
由于Java 8,接口也可以包含默认方法,即可以包含代码,但是可以由实现类覆盖。
最好的例子是Comparable接口。您可以将它用于Numbers,Strings以及任何其他应该具有可比性的类(通常是将它们自己的类实例aka对象)。
抽象类是常规类和接口的混合。它们包含代码和成员变量,但也可以包含抽象方法。当一个类扩展为抽象基类时,他们需要在某个时刻实现抽象方法。
正常类没有任何抽象方法。
谢谢你的出色答案。所以如果我没有弄错的话,一个界面对我来说会是有益的(或者说,如果我要扩展应用程序的话) – HowWhyWhat
这是一个问题Java的开发人员通常会打架。一般的经验法则如下:
当你的类相互交互时,接口是最有用的。您可以在应用程序的一组类中指定某些常用功能。那么如果你的一些代码需要这些功能,你可以在不知道实际实现的情况下使用它们。说,你用一种方法处理形状,并想知道形状的区域。您可能有许多形状,您可以在不知道确切类型(圆形,三角形等)的情况下检索该区域。
一般来说,尽量不要过度使用继承。遵循替代原则:只有在超类可以被子类替换时才使用继承。
例如:在OOP中,带有可变幻灯片的正方形不是具有可变幻灯片的矩形,因为对于矩形,您可以调用setSide(20, 30)
,而对于正方形,您不是(双方必须匹配)。注意:如果您使用在构造函数中初始化的最终字段(如前所述),则会自动解决此问题,并且您可以自由地从矩形继承方形。
在你的情况,我会创造实用工具类与没有上下文常用功能,如计算与给定的输入参数的公式静态方法/场。实际的实体可以是具有通用接口或抽象父类的对象。
答案很简单:创建一个名为“常量”类,并把这些变量有常量:“静public final float GRAVITY_ACCELERATION = 9.81; // meters/second“ – JayC667
@ JayC667那么该类中的所有方法和常量都应该是静态的? – HowWhyWhat
只要让他们在一个大型的“Globals”课程中成为所有静态成员。有些人对这样的事情不以为然,但我对这样的人却皱眉。 –