Java引用和新关键字
我在学习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
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