Java 在不同的类中使用公共数组
我是一个Java新手,在不同的类中使用两个公共数组时遇到错误。这个程序应该通过数学积分来模拟3个星际天体。注意:我是这个网站的新手,还不能确定格式Java 在不同的类中使用公共数组,java,arrays,Java,Arrays,我是一个Java新手,在不同的类中使用两个公共数组时遇到错误。这个程序应该通过数学积分来模拟3个星际天体。注意:我是这个网站的新手,还不能确定格式 package gravitationalmodel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; public class GravitationalModel { private Ob
package gravitationalmodel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class GravitationalModel
{
private Object timer;
private GravitationalObject G1;
private GravitationalObject G2;
private GravitationalObject G3;
public static double[] xArray;
public static double[] yArray;
final public double gravConst = 0.000000000067;
final public int refreshRate = 25;
public GravitationalModel()
{
Timer timer = new Timer(refreshRate, (ActionListener) this); // refreshes model every 25 milliseconds
}
public static void main(String[] args)
{
GravitationalObject G1 = new GravitationalObject(500, 500, 10, 10, 10); // creates 3 interstellar objects taking x position,
GravitationalObject G2 = new GravitationalObject(400, 400, 10, 10, 10); // y position, x veleocity component, y velocity component
GravitationalObject G3 = new GravitationalObject(600, 600, 10, 10, 10); // mass of the object
xArray = new double[1920]; // assigns all elements of array to 0
for (int x = 0; x < 1920; ++x)
{
xArray[x] = 0;
//System.out.println(xArray[x]);
}
yArray = new double[1200];
for (int x = 0; x < 1200; ++x)
{
yArray[x] = 0;
//System.out.println(yArray[x]);
}
}
public void actionPerformed(ActionEvent e) // refreshes model
{
G1.refreshVectorField();
G2.refreshVectorField();
G3.refreshVectorField();
G1.refreshObjects();
G2.refreshObjects();
G3.refreshObjects();
}
}
package gravitationalmodel;
public class GravitationalObject
{
private double xPos; //location and speed of gravitational object
private double yPos;
private double vX;
private double vY;
private double mass;
public GravitationalObject(double x, double y, double xv, double yv, double m)
{
xPos = x;
yPos = y;
vX = xv;
vY = yv;
mass = m;
}
public void refreshVectorField() // calculates gravitational field
{
int k = 1;
for (int x = 0; x < 1920; ++x)
{
if (xPos > x)
k = 1;
else
k= -1;
if (xPos - x == 0)
++x;
xArray[x] += k * (gravConst * mass) / Math.sqrt(xPos - x, 2.0); // errors on this line
}
for (int y = 0; y < 1200; ++y)
{
if (yPos < y)
k = 1;
else
k= -1;
yArray[y] += (gravConst * mass) / Math.sqrt(Math.abs(yPos - y), 2); //errors on this line
}
}
public void refreshObjects()
{
vX += refreshRate/1000 * xArray[xPos]; // errors on these lines
vY += refreshRate/1000 * yArray[yPos];
xPos += refreshRate/1000 * vX;
xPos += refreshRate/1000 * vX;
}
}
包装重力模型;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.Timer;
公共类引力模型
{
私有对象定时器;
私人引力对象G1;
私人引力对象G2;
私人重力物体G3;
公共静态双[]xArray;
公共静态双[]雅雷;
最终公共双gravConst=0.000000000067;
最终公共利率=25;
公共引力模型()
{
Timer Timer=new Timer(refreshRate,(ActionListener)this);//每25毫秒刷新一次模型
}
公共静态void main(字符串[]args)
{
引力对象G1=新引力对象(500500,10,10,10);//创建3个位于x位置的星际对象,
重力对象G2=新的重力对象(400,400,10,10,10);//y位置,x速度分量,y速度分量
重力对象G3=新重力对象(600600,10,10,10);//对象的质量
xArray=new double[1920];//将数组的所有元素分配给0
对于(int x=0;x<1920;++x)
{
xArray[x]=0;
//System.out.println(xArray[x]);
}
雅雷=新双[1200];
对于(int x=0;x<1200;++x)
{
雅雷[x]=0;
//System.out.println(yArray[x]);
}
}
public void actionPerformed(ActionEvent e)//刷新模型
{
G1.refreshVectorField();
G2.refreshVectorField();
G3.刷新向量场();
G1.刷新对象();
G2.refreshObjects();
G3.刷新对象();
}
}
包装重力模型;
公共类引力对象
{
私有双xPos;//重力物体的位置和速度
私人双YPO;
专用双vX;
私人双重身份;
私人双弥撒;
公共重力对象(双x、双y、双xv、双yv、双m)
{
xPos=x;
yPos=y;
vX=xv;
vY=yv;
质量=m;
}
public void refreshVectorField()//计算重力场
{
int k=1;
对于(int x=0;x<1920;++x)
{
如果(xPos>x)
k=1;
其他的
k=-1;
如果(xPos-x==0)
++x;
xArray[x]+=k*(gravConst*mass)/Math.sqrt(xPos-x,2.0);//此行有错误
}
对于(整数y=0;y<1200;++y)
{
if(yPos
您试图从重力对象
访问重力模型.xArray
,而不完全限定静态字段。要么完全限定该字段,要么在重力模型
中创建一个方法来执行该工作
请注意,公共可变字段在Java中通常不受欢迎,因为它破坏了封装。最好让您的对象通过方法封装数据和行为,并保持变量的私有性。作为初学者,您不应该着急。很快你就可以写很酷的程序了。这个程序中有很多错误,甚至程序也没有任何逻辑。你应该先练习一些小程序来获得基础知识。与您创建的以下对象类似,您根本不使用这些对象
GravitationalObject G1 = new GravitationalObject(500, 500, 10, 10, 10); // creates 3 interstellar objects taking x position,
GravitationalObject G2 = new GravitationalObject(400, 400, 10, 10, 10); // y position, x veleocity component, y velocity component
GravitationalObject G3 = new GravitationalObject(600, 600, 10, 10, 10); // mass of the object
现在是程序中的错误
如果要访问其他类中的实例变量gravConst
或refreshRate
,则需要创建类的对象并访问它们。
或者您可以创建静态的,并像这样将它们导入类
导入静态重力模型.gravitationalmodel.xArray;
导入静态重力模型.gravitationalmodel.yArray;
导入静态重力模型。重力模型。重力常数;
导入静态重力模型。重力模型。刷新率代码>
Math.sqrt(double)
不接受2个参数,因此我认为您需要使用xArray[x]+=k*(gravConst*mass)/Math.pow(xPos-x,2.0)代码>
将double强制转换为int作为数组的索引只能是整数,如下所示
vX+=refreshRate/1000*xArray[(int)xPos];
vY+=刷新率/1000*yArray[(int)yPos]代码>
因此,您的最终计划如下:
package gravitationalmodel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class GravitationalModel {
private Object timer;
private GravitationalObject G1;
private GravitationalObject G2;
private GravitationalObject G3;
public static double[] xArray;
public static double[] yArray;
final static public double gravConst = 0.000000000067;
final static public int refreshRate = 25;
public GravitationalModel() {
Timer timer = new Timer(refreshRate, (ActionListener) this); // refreshes
// model
// every
// 25
// milliseconds
}
public static void main(String[] args) {
GravitationalObject G1 = new GravitationalObject(500, 500, 10, 10, 10); // creates
// 3
// interstellar
// objects
// taking
// x
// position,
GravitationalObject G2 = new GravitationalObject(400, 400, 10, 10, 10); // y
// position,
// x
// veleocity
// component,
// y
// velocity
// component
GravitationalObject G3 = new GravitationalObject(600, 600, 10, 10, 10); // mass
// of
// the
// object
xArray = new double[1920]; // assigns all elements of array to 0
for (int x = 0; x < 1920; ++x) {
xArray[x] = 0;
// System.out.println(xArray[x]);
}
yArray = new double[1200];
for (int x = 0; x < 1200; ++x) {
yArray[x] = 0;
// System.out.println(yArray[x]);
}
}
public void actionPerformed(ActionEvent e) // refreshes model
{
G1.refreshVectorField();
G2.refreshVectorField();
G3.refreshVectorField();
G1.refreshObjects();
G2.refreshObjects();
G3.refreshObjects();
}
}
包装重力模型;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.Timer;
公共类引力模型{
私有对象定时器;
私人引力对象G1;
私人引力对象G2;
私人重力物体G3;
公共静态双[]xArray;
公共静态双[]雅雷;
最终静态公共双gravConst=0.000000000067;
最终静态公共int刷新率=25;
公共引力模型(){
计时器计时器=新计时器(刷新率,(ActionListener)this);//刷新
//模型
//每一个
// 25
//毫秒
}
公共静态void main(字符串[]args){
重力对象G1=新重力对象(500500,10,10,10);//创建
// 3
//星际的
package gravitationalmodel;
import static gravitationalmodel.GravitationalModel.xArray;
import static gravitationalmodel.GravitationalModel.yArray;
import static gravitationalmodel.GravitationalModel.gravConst;
import static gravitationalmodel.GravitationalModel.refreshRate;
public class GravitationalObject {
private double xPos; // location and speed of gravitational object
private double yPos;
private double vX;
private double vY;
private double mass;
public GravitationalObject(double x, double y, double xv, double yv,
double m) {
xPos = x;
yPos = y;
vX = xv;
vY = yv;
mass = m;
}
public void refreshVectorField() // calculates gravitational field
{
int k = 1;
for (int x = 0; x < 1920; ++x) {
if (xPos > x)
k = 1;
else
k = -1;
if (xPos - x == 0)
++x;
xArray[x] += k * (gravConst * mass) / Math.pow(xPos - x, 2.0); // errors
// on
// this
// line
}
for (int y = 0; y < 1200; ++y) {
if (yPos < y)
k = 1;
else
k = -1;
yArray[y] += (gravConst * mass) / Math.pow(Math.abs(yPos - y), 2); // errors
// on
// this
// line
}
}
public void refreshObjects() {
vX += refreshRate / 1000 * xArray[(int)xPos]; // errors on these lines
vY += refreshRate / 1000 * yArray[(int)yPos];
xPos += refreshRate / 1000 * vX;
xPos += refreshRate / 1000 * vX;
}
}