2014-11-25 29 views
5

Tôi đang cố gán một mảng đối tượng lớp con cho lớp siêu của nó. Chương trình biên dịch thành công, nhưng tôi nhận được ArrayStoreException. Tôi biết rằng các mảng cha và con là tham chiếu đến cùng một mảng, nhưng tôi không nên truy cập phương thức func ít nhất?Java: Đối tượng mảng siêu lớp được gán với đối tượng mảng lớp phụ

class Pclass 
{ 
    Pclass() 
    { 
     System.out.println("constructor : Parent class"); 
    } 

    public void func() 
    { 
     System.out.println("Parent class"); 
    } 
} 

class Cclass extends Pclass 
{ 
    Cclass() 
    { 
     System.out.println("Constructor : Child class"); 
    } 

    public void func2() 
    { 
     System.out.println("It worked"); 
    } 

    public void func() 
    { 
     System.out.println("Common"); 
    } 
} 

public class test 
{  
    public static void main(String ab[]) 
    {  
     Cclass[] child = new Cclass[10]; 
     Pclass[] parent = child; 
     parent[0]=new Pclass(); 
     parent[0].func(); 
    } 
} 
+0

là mã java phù hợp, bạn đang rất chọn lọc với khả năng hiển thị của mình. Đối với mã thống nhất, bạn muốn một số 'công khai' trong đó (và bạn muốn sửa chữa khoảng trống đó ở khắp nơi ... hãy nhớ đọc qua http://stackoverflow.com/help/how-to-ask - the" hãy nhớ đọc "phần không có trong đó chỉ để cho vui. Nhiều người, bạn đã bao gồm, quên) –

Trả lời

4

Bạn không thể làm điều này:

Cclass[] child = new Cclass[10]; 
Pclass[] parent = child; 
parent[0]=new Pclass(); 

Bạn nên cố gắng làm điều này:

Cclass[] child = new Cclass[10]; 
Pclass[] parent = child; 
parent[0]=new Cclass(); 

Đó là bởi vì, Trước tiên, bạn gán mảng Pclass để tham chiếu đứa trẻ đó chỉ có thể có đối tượng Cclass, sau đó bạn đang cố gắng gán đối tượng Pclass cho tham chiếu cha mẹ, điều đó không được phép!

Xem, những gì xảy ra là bạn đã tạo ra một đối tượng Cclass trên heap khi bạn đã viết Cclass mới, mặc dù các đối tượng Cclass là null trong mảng nhưng bây giờ họ sẽ chỉ chấp nhận đối tượng Cclass hoặc đó là đối tượng lớp con của

do đó việc gán đối tượng Pclass sẽ là bất hợp pháp!

Lý do nhận được một ngoại lệ thời gian chạy và không biên dịch thời gian:

Trình biên dịch chỉ kiểm tra xem các lớp học nằm trong hệ thống phân cấp thừa kế cùng hay không, vì họ đang có trong hệ thống phân cấp cùng bạn sẽ có được một ngoại lệ Runtime.

+0

OP biết anh ấy không thể làm điều đó - câu hỏi là * tại sao * không? Đề xuất thay thế của bạn không liên quan gì đến câu hỏi này.-1 – drewmoore

+0

@drewmoore cần có thời gian để viết câu trả lời đầy đủ :) –

+0

downvote được hủy bỏ, nhưng bạn vẫn chưa thực sự trả lời câu hỏi này. Sự nhầm lẫn cơ bản là vấn đề tham chiếu vs giá trị – drewmoore

0

Mặc dù tham chiếu đến mảng là Pclass, họ đối tượng mảng bạn đang tham chiếu là loại Cclass (bạn khởi tạo đối tượng new Cclass[]. Bạn không thể thay đổi kiểu của đối tượng bằng cách có một biến của một loại khác nhau tham khảo nó). Bạn không thể lưu trữ đối tượng Pclass trong một mảng Cclass.

Thay vào đó, nếu có thể, bạn nên tạo các đối tượng bằng cách sử dụng kiểu phụ:

parent[0] = new Subclass(); 
1

Nếu bạn đọc spec của ArrayStoreException, bạn muốn tìm hiểu nó được ném to indicate that an attempt has been made to store the wrong type of object into an array of objects.

Bạn tạo ra một thể hiện của một mảng Cclass, vì vậy chỉ các trường hợp Cclass (hoặc các lớp con của nó) mới có thể được lưu trữ trong mảng này. Thực tế là bạn lưu trữ tham chiếu của cá thể đó trong một biến kiểu Pclass[] không thay đổi điều đó.

0

Bạn đã thực sự khởi tạo đối tượng lớp con trong dòng: Cclass[] child = new Cclass[10]; và khi bạn khởi tạo đối tượng cha bằng cách sử dụng new Pclass(); bạn tạo đối tượng cha.Khi bạn gán cho đối tượng con tham chiếu downcasting xảy ra khi chạy và không thành công vì bạn đang cố gắng để lưu trữ đối tượng cha mẹ vào một tham chiếu con.Hence nó ném ArrayStoreException tức là bạn đang cố gắng để lưu trữ các loại sai của đối tượng vào một mảng các đối tượng.

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