簡體   English   中英

Java參考和新關鍵字

[英]Java reference and new keyword

我在學習Java時寫了一個簡單的棋盤,並提出了以下問題:

我有抽象類ChessPiece和類,如KingQueenRook等,它們都擴展了ChessPiece

我有一個棋盤的二維ChessPiece陣列。

public ChessPiece myChessBoard[][] = new ChessPiece[8][8];

然后我像這樣制作我的棋子:

ChessPiece aPiece = new Rook();

把它放在myChessBoard上,這樣我就可以找到它:

myChessBoard[0][0] = aPiece;

其他作品也一樣......

我的問題是當我做這個public ChessPiece myChessBoard[][] = new ChessPiece[8][8]; 在我的第一步中,我使用了新關鍵字並分配了8 * 8 = 64個ChessPiece對象嗎? 但是我在寫ChessPiece aPiece = new Rook();時再次這樣做了ChessPiece aPiece = new Rook(); 我感覺myChessBoard中的東西,比如myChessBoard [0] [0]不需要分配,因為它只是一個參考,並且不需要像new Rook()那樣真正的棋子。

總之,我覺得我只需要分配32個帶有新關鍵字的棋子(棋盤上有32個棋子),而不是32 + 64 = 96個棋子。

我可能在Java中混淆​​了一些基本概念,請幫忙。

編輯:

myChessBoard[][] = new ChessPiece[8][8]這里我使用new關鍵字創建64個沒有真實對象的引用。 所以new關鍵字不一定會創建新對象,它也可以創建引用null的新引用,對吧?

那是錯的。 “在這種情況下,新關鍵字正在創建一個新的2D數組對象”,這要歸功於已接受的答案。

所有你正在使用這個public ChessPiece myChessBoard[][] = new ChessPiece[8][8]; 正在初始化一個新的游戲板。 游戲板有64個正方形(每個正方形由2D索引值表示),而不是64個棋子。 所以每個方塊都可以給出像myChessBoard[0][0] = new Rook();

// 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

public ChessPiece myChessBoard[][] = new ChessPiece[8][8]; 你沒有創建一個ChessPiece 您只創建了一個能夠引用64個ChessPieces的Array。

所有引用最初都將為null ,您必須將它們設置為myChessBoard[1][4] = new Rook()

所以沒必要擔心。

我認為你的ChessPiece類無論如何都是抽象的,所以Java無論如何都不可能創建一個ChessPiece。

但還有一點:Java有自動垃圾收集。 因此,即使你有時會創建一些不必要的對象,垃圾收集器也會很快擺脫它。 不要過早優化。 現在每台計算機都可以處理96或32個對象,並且沒有任何明顯的區別。

編寫new ChessPiece[8][8]不會分配64個ChessPiece對象。 它只創建一個數組,其中包含64個空引用。 你需要單獨制作ChessPiece對象,這就是你正在做的事情。

請注意,許多OOP語言(特別是C ++)在這方面的工作方式不同。

public ChessPiece myChessBoard[][] = new ChessPiece[8][8]是一個數組分配語句。 沒有分配64個新的ChessPiece對象,而是一個二維數組,其中包含8 * 8 = 64個對ChessPiece的引用,其中大部分都是null 只有填充每個單獨的正方形才能實際創建一個新的ChessPiece對象。

話雖如此,你確實有一點,這個分配政策看起來確實有些浪費。 我給你的建議,因為這是一個學習項目 - 在自己的類中隱藏棋盤實現(例如, ChessBoard ),現在它將包含你的二維數組。 一旦你讓其他一切工作滿意,你就可以回過頭來優化ChessBoard的內存消耗。

當你打電話給ChessPiece myChessBoard[][] = new ChessPiece[8][8]; ,你沒有實例化任何ChessPiece對象。 您只是創建一個可以容納它們的2D數組。 為了給出一個真實的類比,當你購買塑料容器來存放剩余的食物時,它們不會隨附食物 - 你可以將它放入容器中。

在創建數組時,您只需將以空值開頭的存儲單元分配,但也可以用於以后存儲國際象棋,然后創建其中的64個。 到目前為止沒有棋子。 那些仍然需要單獨創建。

假設你建造了一個擁有10,000個牢房的監獄。 這本身就很棒,但你仍然需要找到10,000名囚犯來填充它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM