为什么这个 class 没有正确执行?
Why doesn't this class execute properly?
这是我的第一个 class 世界
public class World {
private static char[][] world2D;
private int characterRow;
private int characterColumn;
public World(int width, int height){
world2D = new char[width][height];
characterColumn = 0;
characterRow = 0;
for(int i = 0; i < world2D.length; i++){
for(int j = 0; j < world2D[i].length; j++){
world2D[i][j] = '-';
}
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveUp(){
world2D[characterRow][characterColumn] = '-';
if (characterRow > 0){
characterRow -= 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveDown(){
world2D[characterRow][characterColumn] = '-';
if (characterRow < world2D.length){
characterRow += 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveRight(){
world2D[characterRow][characterColumn] = '-';
if (characterColumn < (world2D[characterRow].length - 1)){
characterColumn += 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveLeft(){
world2D[characterRow][characterColumn] = '-';
if (characterColumn > 0){
characterColumn -= 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public static void displayWorld(){
for(int i = 0; i < world2D.length; i++){
for(int j = 0; j < world2D[i].length; j++){
System.out.print(world2D[i][j]);
}
System.out.println();
}
}
}
这是我的第二个 class 叫 Driver
import java.util.Scanner;
public class Driver {
public static void main(String[]args){
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("How tall should the world be?: ");
int height = input.nextInt();
System.out.print("How wide should the world be?: ");
int width = input.nextInt();
World myWorld = new World(width,height);
World.displayWorld();
}
}
为什么我不需要专门在 World 的 myWorld 实例上调用 displayWorld class?
如果我创建了多个 World 实例怎么办?这不可能是对的。
**编辑以获取更多详细信息
我想在 World class myWorld object 的实例上调用 class 方法之一(即 moveUp 或 moveDown)。但是,我无法将我对 object (myWorld) 的引用传递到这些方法中。我希望能够调用其中一种方法,它会更改二维数组中 'P' 的位置,并使用我定义的方法(包括 displayWorld 方法
将其打印出来
静态变量,例如 private static char[][] world2D,存在于 class 中,而不是 class 的对象。这意味着它们是通过 class 名称而不是实例名称访问的。由于您是在构造函数中初始化它,因此每次创建新世界时它都会更改,但每个实例的值都是相同的。看起来您应该使变量 world2D 成为非静态的(只需删除 static 关键字)并对函数 displayWorld() 执行相同的操作
然后,行 World.displayWorld();
可以替换为 myWorld.displayWorld();
请参阅 this link 以了解有关 static
类型的更多信息。
如果要显示不同实例的世界,请从 public static void displayWorld()
中删除 static
并调用 myWorld.displayWorld()
。
这是我的第一个 class 世界
public class World {
private static char[][] world2D;
private int characterRow;
private int characterColumn;
public World(int width, int height){
world2D = new char[width][height];
characterColumn = 0;
characterRow = 0;
for(int i = 0; i < world2D.length; i++){
for(int j = 0; j < world2D[i].length; j++){
world2D[i][j] = '-';
}
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveUp(){
world2D[characterRow][characterColumn] = '-';
if (characterRow > 0){
characterRow -= 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveDown(){
world2D[characterRow][characterColumn] = '-';
if (characterRow < world2D.length){
characterRow += 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveRight(){
world2D[characterRow][characterColumn] = '-';
if (characterColumn < (world2D[characterRow].length - 1)){
characterColumn += 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public void moveLeft(){
world2D[characterRow][characterColumn] = '-';
if (characterColumn > 0){
characterColumn -= 1;
}
world2D[characterRow][characterColumn] = 'P';
}
public static void displayWorld(){
for(int i = 0; i < world2D.length; i++){
for(int j = 0; j < world2D[i].length; j++){
System.out.print(world2D[i][j]);
}
System.out.println();
}
}
}
这是我的第二个 class 叫 Driver
import java.util.Scanner;
public class Driver {
public static void main(String[]args){
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("How tall should the world be?: ");
int height = input.nextInt();
System.out.print("How wide should the world be?: ");
int width = input.nextInt();
World myWorld = new World(width,height);
World.displayWorld();
}
}
为什么我不需要专门在 World 的 myWorld 实例上调用 displayWorld class?
如果我创建了多个 World 实例怎么办?这不可能是对的。
**编辑以获取更多详细信息
我想在 World class myWorld object 的实例上调用 class 方法之一(即 moveUp 或 moveDown)。但是,我无法将我对 object (myWorld) 的引用传递到这些方法中。我希望能够调用其中一种方法,它会更改二维数组中 'P' 的位置,并使用我定义的方法(包括 displayWorld 方法
将其打印出来静态变量,例如 private static char[][] world2D,存在于 class 中,而不是 class 的对象。这意味着它们是通过 class 名称而不是实例名称访问的。由于您是在构造函数中初始化它,因此每次创建新世界时它都会更改,但每个实例的值都是相同的。看起来您应该使变量 world2D 成为非静态的(只需删除 static 关键字)并对函数 displayWorld() 执行相同的操作
然后,行 World.displayWorld();
可以替换为 myWorld.displayWorld();
请参阅 this link 以了解有关 static
类型的更多信息。
如果要显示不同实例的世界,请从 public static void displayWorld()
中删除 static
并调用 myWorld.displayWorld()
。