我目前正在尝试使用2D阵列绘制形状。在我的班级中,有一个用public char canvas[][];
到目前为止,我只使用char canvas[][] = new char[height][width];
如果已经声明了这个数组,并且我不应该修改我已经给出的代码,那么如何调用该数组的实例以便我可以使用它呢?
感谢。
(编辑)
class DrawingSystem {
public char canvas[][];
public static void makeNewCanvas(int tmpWidth, int tmpHeight) {
canvas[][] = new char[tmpHeight][tmpWidth];
for (int row=0; row<tmpHeight; row++) {
for (int col=0; col<tmpWidth; col++) {
canvas[row][col] = ' ';
}
}
}
答案 0 :(得分:2)
静态方法和实例变量之间存在不兼容性。
以这种方式思考:实例变量与类的特定实例相关联;静态变量与类本身相关联。您可以通过类调用静态方法:
ClassI.callStaticMethod();
而您通过类的实例调用实例方法:
public ClassI classObj = new ClassI();
classObj.callInstanceMethod();
在您发布的代码中,有一个实例变量(“canvas”)在静态方法中设置(main
与Class相关联,而不是实例)。
因此,您需要创建实例方法来修改/更新“画布”,并在静态函数中创建类的实例。该对象(“实例”)可用于更新实例变量。
以下是一个例子:
public class Foo {
public char canvas[][];
public static void main(String[] args) {
Foo fooObj = new Foo(); //creates an instance of this class
fooObj.createCanvas(2, 2);
fooObj.modifyCanvas(0, 0, 'c');
}
public void createCanvas(int x, int y) {
canvas = new char[x][y];
}
public void modifyCanvas(int x, int y, char c) {
canvas[x][y] = c;
}
}
这显然与你的任务没有一对一的关联,但我相信你能够使它适应你正在做的事情: - )
答案 1 :(得分:2)
您的问题是makeNewCanvas(int tmpWidth, int tmpHeight)
是静态的,或public char canvas[][]
不是静态的。
在Java中,静态类成员只能与其他静态类成员一起使用。静态成员属于该类,非静态成员属于实例。该类是用于创建对象的模板,这些对象称为类的实例。当您声明静态时,它将被该类的所有实例共享。对于方法,这意味着静态方法在所有实例上的行为必须完全相同。
DrawingSystem a = new DrawingSystem();
DrawingSystem b = new DrawingSystem();
a
和b
是类DrawingSystem
的实例,这意味着它们每个都有自己的canvas
数组。既然makeNewCanvas
是静态的,并且所有实例的行为必须相同,那么它就不能使用a.canvas
或b.canvas
,因为它们对于a
和b
来说是唯一的不同的内容。
答案 2 :(得分:1)
我不确定我的问题是否正确,
但看起来你需要一个Singleton模式,而不是将char canvas[][]
声明为公共字段,将canvas数组封装为只读属性
public class MyDrawing
{
private char canvas[][] = null;
public char[][] getCanvas()
{
if (canvas!=null)
{
canvas =new char[height][width];
}
return canvas;
}
当您需要canvas数组而不是之前使用的canvas公共变量时,在代码的其他部分使用getCanvas()
。
答案 3 :(得分:0)
有点对你的要求感到困惑。
你总是可以随时重新声明全局数组,并根据自己的需要使用它...但这似乎相当可疑(意思是......为什么这是一个全局数组)。
看起来你的画布不应该改变尺寸......但是,我不太了解你的情况。
检查数组是否为null,如果是,请将其声明为您想要的大小并愉快地使用它?