2016-01-20 52 views
-1

我正尝试在Java中创建一个n体模拟器,同时也学习OOP。Java OOP - 物理引擎类型

我想有一个包含所有物理常数和物理公式文件,我想计算力等时,在其他班级使用这些

如果这个文件是一个普通班的所有变量静态的,一个接口或一个抽象类,还是其他的东西?我对所有的定义都很困惑。

+3

答案很简单:创建一个名为“常量”类,并把这些变量有常量:“静public final float GRAVITY_ACCELERATION = 9.81; // meters/second“ – JayC667

+0

@ JayC667那么该类中的所有方法和常量都应该是静态的? – HowWhyWhat

+1

只要让他们在一个大型的“Globals”课程中成为所有静态成员。有些人对这样的事情不以为然,但我对这样的人却皱眉。 –

回答

0

在你的情况下,我会创建一个名为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); 
0

您可以使用接口强制类(实现这些接口)具有已定义的方法(在接口中定义),您可以确保基本功能,而所有类在所有其他方面可以完全不同。

在一个接口中,您只定义了方法签名(返回值,名称,参数类型)。这些纯粹是抽象的。

由于Java 8,接口也可以包含默认方法,即可以包含代码,但是可以由实现类覆盖。

最好的例子是Comparable接口。您可以将它用于Numbers,Strings以及任何其他应该具有可比性的类(通常是将它们自己的类实例aka对象)。

抽象类是常规类和接口的混合。它们包含代码和成员变量,但也可以包含抽象方法。当一个类扩展为抽象基类时,他们需要在某个时刻实现抽象方法。

正常类没有任何抽象方法。

+0

谢谢你的出色答案。所以如果我没有弄错的话,一个界面对我来说会是有益的(或者说,如果我要扩展应用程序的话) – HowWhyWhat

0

这是一个问题Java的开发人员通常会打架。一般的经验法则如下:

  • 如果你使用一个静态字段,总是使它成为final,永远不要试图改变它。
  • 如果您需要一个可变字段,请创建一个非静态字段。
  • 如果可能,请在构造函数中初始化该字段并将其标记为最终。
  • 只有当方法没有访问非静态字段(即它们没有上下文)时,方法才是静态的,不需要抽象它们(例如在测试用例中)并且它们是完全功能的(this应该暗示 没有静态字段是可变的)。一个很好的例子是Math.sqrt(),其中平方根操作没有上下文,不会改变应用程序的状态,也不会想要对其进行抽象。在所有其他情况下,使用非静态方法。有些人完全避免静态方法。

当你的类相互交互时,接口是最有用的。您可以在应用程序的一组类中指定某些常用功能。那么如果你的一些代码需要这些功能,你可以在不知道实际实现的情况下使用它们。说,你用一种方法处理形状,并想知道形状的区域。您可能有许多形状,您可以在不知道确切类型(圆形,三角形等)的情况下检索该区域。

一般来说,尽量不要过度使用继承。遵循替代原则:只有在超类可以被子类替换时才使用继承。

例如:在OOP中,带有可变幻灯片的正方形不是具有可变幻灯片的矩形,因为对于矩形,您可以调用setSide(20, 30),而对于正方形,您不是(双方必须匹配)。注意:如果您使用在构造函数中初始化的最终字段(如前所述),则会自动解决此问题,并且您可以自由地从矩形继承方形。

在你的情况,我会创造实用工具类与没有上下文常用功能,如计算与给定的输入参数的公式静态方法/场。实际的实体可以是具有通用接口或抽象父类的对象。