2013-10-11 28 views
8

Tại sao tôi không thể khởi tạo một lớp trừu tượng nhưng tạo một mảng của lớp trừu tượng?Mảng lớp trừu tượng

public abstract class Game{ 
    ... 
} 

Game games = new Game(); //Error 
Game[] gamesArray = new Game[10]; //No Error 
+0

Vì bạn có thể đặt tất cả các kiểu con của 'Trò chơi' vào mảng, nhưng một lớp trừu tượng có thể không được khởi tạo vì nó" không đầy đủ ". – Matthias

Trả lời

11
Game[] gamesArray = new Game[10]; 

Tức thì nghĩa là tạo một thể hiện của một lớp. Trong trường hợp trên, bạn vừa khai báo một số gamesArray loại Game với kích thước 10 (chỉ là tham chiếu và không có gì khác). Đó là lý do tại sao nó không ném bất kỳ lỗi nào.

Bạn sẽ nhận được thông báo lỗi khi bạn cố gắng làm

gamesArray[0] = new Game(); // because abstract class cannot be instantiated 

nhưng làm cho một mảng của lớp trừu tượng?

Sau đó, bạn có thể làm một cái gì đó như thế này

gamesArray[0] = new NonAbstractGame(); // where NonAbstractGame extends the Games abstract class. 

này được cho phép rất nhiều và đây là lý do tại sao bạn sẽ được đi ở cho một lớp trừu tượng về địa điểm đầu tiên.

+1

Ahh..thanks. Đó là Tuyên bố và Instantiation. – Nitin

+1

Không có @Nitin, nó không thực sự về tuyên bố vs instantiation. Viết 'trò chơi mới [10]' tạo ra một mảng - nó không thể khởi tạo bất kỳ Trò chơi nào. Phần _declaration_ là nơi bạn viết 'Game [] gamesArray', nó khai báo biến kiểu" mảng Trò chơi ". –

+0

@DavidWallace OK. Cám ơn giải thích rõ ràng. – Nitin

2

Vì khi bạn tạo một mảng của một số loại đối tượng, bạn không cố gắng tạo nhanh đối tượng. Tất cả những gì bạn đang thực hiện là một số vị trí để đặt tham chiếu.

new Game[10]; làm cho 10 vị trí cho Game tham chiếu, nhưng nó không tạo ra một đơn Game.

1

Lớp trừu tượng không thể được khởi tạo, chúng có thể được mở rộng. Mảng trong thực tế các đối tượng, bạn chỉ cần nói với JVM của bạn: hey buddy, làm cho một số phòng cho 10 trò chơi đối tượng. Đó là tất cả, bạn không khởi tạo bất kỳ đối tượng Game nào.

2

Bởi vì bạn không vi phạm các abstract class rules.Essentially,

Game games = new Game(); 

được chia nhỏ để:

Game games; //Will Work because it's just a declaration 
games=new Game(); //Will not work because it's instantiation 

Trong khi tạo các đối tượng là hoàn toàn hợp lệ cho các lớp trừu tượng, khởi tạo không được phép.

1

Game games = new Game(); Đây là bản sao của Trò chơi lớp trừu tượng không được phép.

Tạo mảng với sau Trò chơi [] trò chơiArray = new Game [10];

cũng giống như tuyên bố đối tượng trò chơi ở đây nó không phải là tạo cá thể. như trò chơi;

Hoặc bạn khai báo 10 đối tượng của lớp Trò chơi hoặc mảng trò chơi đều giống nhau, chỉ phân bổ bộ nhớ sẽ khác nhau.

Cảm ơn

Tej Kiran

1

Abstract Class như tên ngụ ý không thể được khởi tạo.Khi bạn đã thực hiện Game[] gamesArray = new Game[10];, nó đang tạo một array có thể giữ Game references. Hãy cố gắng liên kết nó với một kịch bản thực tế.

Giả sử bạn có lớp trừu tượng Animal. Bạn không thể khởi tạo nó vì động vật không phải là một lớp cụ thể nên Animal obj = new Animal() sẽ thất bại. Nhưng Animal[] animalArray = new Animal[10] sẽ tạo một mảng có thể chứa tham chiếu đến 10 đối tượng kiểu động vật như chó, mèo, ngựa và vân vân.

2

- Một lớp Abstract là người mà dụ KHÔNG THỂ được tạo.

- Tạo một mảng giữ biến tham chiếu đối tượng của lớp trừu tượng đó chỉ là tham chiếu không phải đối tượng chính nó.

- Lớp Abstract cũng như Interface trong Java được sử dụng để triển khai các hành vi luôn thay đổi. Hãy xem xét các Abstract class like laying down some protocols for its concrete classes.

Ví dụ:

public abstract class Vehicle{ 


} 

public class Car extends Vehicle{ 

    public static void main(String[] args){ 

     Car car1 = new Car();   (Possible) 
     Vehicle car2 = new Car();  (Possible) 
     Vehicle car3 = new Vehicle();  (NOT Possible) 

    } 

} 
+0

'Xe ô tô2 = Xe mới(); (Có thể) Xe ô tô3 = xe mới(); (KHÔNG THỂ) 'Hai câu này khác nhau như thế nào? – Prateek

+0

@Prateek ... xin lỗi thân yêu .. đó là một lỗi đánh máy từ phía tôi .. tôi đã sửa chữa nó ... cảm ơn vì đã phát hiện lỗi đánh máy –

+0

Bây giờ bạn đã hiểu đúng :) Trong một giây bạn đã cho tôi suy nghĩ – Prateek

0

Các lớp trừu tượng không có phương pháp hoàn toàn fleshed ra. Chúng được sử dụng như các lớp cơ sở sẽ được mở rộng thêm bởi các lớp khác "kế thừa" chúng.

Ví dụ: bạn có thể có lớp trừu tượng có tên là Thú cưng.

public abstract class Pet{ 
     private String name; 
     public void setName(String name){ 
      this.name = name; 
     } 
     public String getName(){ 
      return this.name; 
     } 
     abstract String makeNoise(); 
    } 

Điều đó có thể được kéo dài thêm lớp kế thừa:

public class Cat extends Pet { 
     public Cat(){ ... } 
     ... 
     public String makeNoise(){ 
       return "Meow!"; 
     } 
    } 
    ... 
    public class Dog extends Pet { 
     public Cat(){ ... } 
     ... 
     public String makeNoise(){ 
       return "Bark!"; 
     } 
    } 

Từ đó, bạn có thể có những thứ trong mã của bạn như:

Pet thisPet = new Dog(); 
    ... 
    thisPet = new Cat(); 

Và bạn có thể tạo ra các mảng của Pets đó sẽ lấy cả Mèo và Chó là yếu tố có thể chấp nhận được.

Pet petArr[] = new Pet[2]; 
    petArr[0] = new Cat(); 
    petArr[1] = new Dog(); 

Để biết thêm thông tin, tôi khuyên bạn nên xem phần hướng dẫn java bao gồm lớp trừu tượng here.

Các vấn đề liên quan