2015-10-23 15 views
10

Tôi đã xem mã số guessgame. Có một đoạn mã nơi ba đối tượng trình phát được khởi tạo theo cách sau:Các cách khác nhau để khởi tạo biến trong Java

public class guessgame{ 
    Player p1; 
    Player p2; 
    Player p3; 
    public void startGame() { 
     p1 = new Player(); 
     p2 = new Player(); 
     p3 = new Player(); 
    ... 
    } 
    ... 
} 

Điều tương tự cũng xảy ra khi tôi tuyên bố và khởi tạo theo cách sau.

public class GuessGame { 
    Player p1 = new Player(); 
    Player p2 = new Player(); 
    Player p3 = new Player(); 
    public void startGame(){ 
     ... 
    } 
    ... 
} 

Có sự khác biệt nào giữa hai loại này không? Trong ví dụ đầu tiên, tại sao ba biến cá thể được khai báo bên ngoài phương thức startgame(), và nó thực sự quan trọng trong nội bộ?

+2

Phiên bản thứ hai initialises ba cầu thủ trên instantiation của lớp 'GuessGame', là người đầu tiên initialises họ khi 'startGame()' được chạy. – Phylogenesis

+1

@CaffeineToCode Chúng được khai báo ở cấp lớp trong cả hai trường hợp. – Phylogenesis

+0

@Phylogenesis xin lỗi, tôi đoán tôi không thể đọc được. Đang xóa. – CaffeineToCode

Trả lời

10

Có sự khác biệt nào giữa hai loại này không?

Có. Mã trong đoạn đầu tiên sẽ chỉ thực hiện trong ngữ cảnh startGame. Nếu bạn không gọi startGame, các đối tượng sẽ vẫn là null. Mỗi khi bạn gọi startGame, các đối tượng cũ, nếu có, sẽ bị loại bỏ và được thay thế bằng các đối tượng mới.

Đoạn thứ hai sẽ thực hiện một lần cho mỗi đối tượng GuessGame khi bạn gọi bất kỳ nhà thầu nào của nó. Mã sẽ được chia sẻ giữa tất cả các nhà xây dựng.

Trong ví dụ đầu tiên, tại sao là biến 3 dụ tuyên bố bên ngoài startGame() phương pháp

Cách duy nhất để khai báo một biến Ví dụ là để làm điều đó ngoài một phương pháp. Các biến được khai báo bên trong một phương thức là người dân địa phương.

Một khác biệt khác giữa cách thứ nhất và thứ hai là các phương thức gọi điện thoại truy cập người chơi sẽ trở thành "hợp pháp" chỉ sau khi gọi startGame trong đoạn mã đầu tiên.

3

Trong phương pháp thứ hai, bạn chỉ cần thực hiện cả hai thứ cùng một lúc - khai báo và khởi tạo. Sự khác biệt là, bạn cần chạy phương thức startGame() trong ví dụ đầu tiên để khởi tạo chúng.

1

p1, p2, p3 không phải là biến cục bộ, mà là các trường lớp.

Chúng có sẵn cho tất cả các phương thức lớp sau khi cá thể lớp được tạo.

Trong đoạn đầu tiên, giá trị của ba trường là nullcho đến phương thức startGame() được gọi.

Trong đoạn thứ hai, các trường được khởi tạo trong quá trình tạo ví dụ.

+0

Cảm ơn bạn. Có ý nghĩa. – nohup

7

Nếu bạn khởi tạo bên ngoài phương thức, sau đó nó được thực hiện khi lớp được khởi tạo và bộ nhớ được cấp phát cho chúng. Nếu không, nó chỉ nhận giá trị rỗng (hoặc giá trị mặc định cho các nguyên thủy) được gán cho chúng.

Nếu bạn không bao giờ gọi startgame(), thì bạn đang trì hoãn phân bổ nó và có lẽ người dùng không bao giờ muốn bắt đầu trò chơi.Điều này là thông minh nếu người chơi mất rất nhiều bộ nhớ để xây dựng và bạn không muốn người dùng phải đợi điều đó xảy ra (cấp phát bộ nhớ) và chỉ chạy các phương thức ngay lập tức (không sử dụng chúng). Nếu vì một số lý do bạn có một số phương pháp cần sử dụng biến p1, p2, p3, thì sự phối hợp của người sẽ khởi tạo có thể gây nhầm lẫn, vì vậy bạn có thể cắn đạn và khởi tạo chúng trước. Nếu bạn biết sẽ có 3 người chơi, tại sao làm phiền các phương pháp với nó? Nếu không, bạn sẽ phải làm điều gì đó như:

if (p1 == null){ 
    p1 = new Player(); 
} 
+0

Ưu điểm chính của việc khởi tạo trong 'startGame()' là bạn luôn có thể bắt đầu một trò chơi mới bằng cách gọi 'startGame()' và người chơi sẽ được khởi tạo lại. Điều này quan trọng nếu 'Người chơi' nắm giữ dữ liệu có thể thay đổi như điểm số. Tuy nhiên, – Kayaman

+0

, nó không loại trừ lẫn nhau. nói rằng tôi gọi nó restartGame() và khởi tạo lại các đối tượng, cũng nên làm việc tốt. – ergonaut

3

Ví dụ đầu tiên của bạn, đối tượng được khởi tạo chỉ khi bạn gọi phương thức startGame(). Trước khi gọi đến phương thức này, p1, p2p3 bằng null.

Trên ví dụ thứ hai của bạn, bạn khai báo và tạo nhanh chúng trực tiếp. Vì vậy, họ được khởi tạo ở việc tạo ra các lớp học.

2

1: Khởi tạo tại phương pháp StartGame()

guessgame gg = new guessgame() // Here p1 is null 

2: ở cấp lớp

GuessGame GG = new GuessGame() // OK p1 is initialized 
Các vấn đề liên quan