Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java引用和新关键字_Java_Oop_Abstract - Fatal编程技术网

Java引用和新关键字

Java引用和新关键字,java,oop,abstract,Java,Oop,Abstract,我在学习Java的同时编写了一个简单的棋盘,并提出了以下问题: 我有抽象类ChessPiece和类King、Queen、Rook等,它们都扩展了ChessPiece 我在棋盘上有一个二维棋子阵列 public ChessPiece myChessBoard[][] = new ChessPiece[8][8]; 然后我把我的棋子做成这样: ChessPiece aPiece = new Rook(); 把它放在我的棋盘上,这样我就能找到它: myChessBoard[0][0] = aPie

我在学习Java的同时编写了一个简单的棋盘,并提出了以下问题:

我有抽象类
ChessPiece
和类
King
Queen
Rook
等,它们都扩展了
ChessPiece

我在棋盘上有一个二维棋子阵列

public ChessPiece myChessBoard[][] = new ChessPiece[8][8];
然后我把我的棋子做成这样:

ChessPiece aPiece = new Rook();
把它放在我的棋盘上,这样我就能找到它:

myChessBoard[0][0] = aPiece;
其他作品也是如此

我的问题是当我做这个
公共棋子myChessBoard[][]=新棋子[8][8];
在我的第一步中,我使用了new关键字并分配了8*8=64个棋子对象,对吗?但我在编写
ChessPiece=newrook()时又做了一次我觉得myChessBoard中的东西,比如myChessBoard[0][0]不需要分配,因为它只是一个参考,不需要像
new Rook()
这样的真正棋子那样占用那么多空间

简而言之,我觉得我只需要分配32个带有新关键字的棋子(棋盘上的32个棋子),而不是32+64=96个棋子

我可能混淆了Java中的一些基本概念,请帮助

编辑:

myChessBoard[][]=newchesspiece[8][8]
这里我使用new关键字创建了64个引用,没有实际对象。所以new关键字不一定创建新对象,它还可以创建引用null的新引用,对吗


这是错误的。“在这种情况下,新的关键字是创建一个新的2D数组对象”,这要感谢接受的答案。

否。写入
新棋子[8][8]
不会分配64个
棋子
对象。它只创建一个数组,其中包含64个空引用。您需要分别创建
棋子
对象,这就是您要做的


请注意,许多OOP语言(特别是C++)在这方面的工作方式不同。

公共棋子MyChesspiece[][]=new ChessPiece[8][8]
是一个数组分配语句。它不分配64个新的
ChessPiece
对象,而是分配一个二维数组,其中包含对
ChessPiece
的8*8=64个引用,其中大多数引用是
null
。只有填充每个方块,你才能真正创建一个新的
棋子
对象


话虽如此,你还是有道理的,而且这种分配政策看起来确实有些浪费。我给你的建议是,因为这是一个学习项目——在自己的类中隐藏棋盘实现(例如,
chessboard
),现在它将包含二维数组。一旦您对其他一切都满意了,您可以在执行
公共棋子myChessBoard[]][]=新棋子[8][8]时返回并优化
棋盘的内存消耗
您没有创建单个
棋子
。您只创建了一个能够引用64个棋子的数组

所有引用最初都是
null
,您必须将它们设置为
myChessBoard[1][4]=new Rook()

所以没有必要担心

我假设您的ChessPiece类无论如何都是抽象的,所以Java无论如何都不可能创建一个ChessPiece


但还有一点:Java具有自动垃圾收集功能。因此,即使有时确实创建了一些不必要的对象,垃圾收集器也会很快将其清除。不要过早地优化。现在,每台计算机都能处理96或32个对象,不会有任何明显的差别。

你用这个
公共棋子我的棋盘[][]]=新棋子[8][8]正在初始化新的游戏板。游戏板有64个方块(每个方块由2D索引值表示),而不是64个棋子。因此,可以给每个方块一个棋子值,如
myChessBoard[0][0]=newrook()


当您调用
棋子myChessBoard[][]=新棋子[8][8],您没有实例化任何
棋子
对象。您只需创建一个可以容纳它们的二维阵列。给一个现实生活的类比,当你买塑料容器来装剩饭时,它们里面没有食物——你以后把它们放进容器里。

当你创建数组时,你只需分配开始为空的存储单元,但以后也可以用来存储棋子,你就创建了64个。到目前为止还没有棋子。这些仍然需要单独创建


假设你建了一座有10000间牢房的监狱。这本身就很好,但你仍然需要找到10000名囚犯来填充它。

你正在实例化抽象类?@user2837260不,我不是。唯一的抽象类是
ChessPiece
newchesspiece[8][8]??@user2837260下面的答案只是解释了一下。你的问题也很有启发性@user2837260:实际上,创建一个数组来保存某个抽象类的具体实例很有意义。因此
new
关键字也可以创建新引用而不是新对象,对吗?最终,创建一个新对象就是创建一个新引用。我可能没有正确理解您的问题。我的意思是
myChessBoard[][]]=new ChessPiece[8][8]
这里我使用
new
关键字创建了64个没有真实对象的引用。在这种情况下,
new
关键字正在创建一个新的2D数组对象。我不明白你为什么要更改引用。棋盘不是
棋子
对象,它是容纳
棋子
类型对象的任何数组。这两个reall之间没有任何关系,只是数组必须包含
棋子
类型的对象哦,因此
new
正在创建一个2D数组对象,这现在是有意义的。我知道它不会创建64个棋子对象实例。我没有意识到2D数组本身就是一个对象。因此new关键字也可以进行新引用,而不是new
// or to give your pieces references
Knight blackKnight1 = new Knight();
myChessBoard[0][1] = blackKnight1;

Bishop blackBishop1 = new Bishop();
myChessBoard[0][2] = blackBishop1;

Queen blackQueen = new Queen();
myChessBoard[0][3] = blackQueen;

// and do the rest with all the other pieces according 
// to their position in the 2d array