2010-06-22 26 views
5

tôi có hai lớp trong java như:ClassCastException

class A { 

int a=10; 

public void sayhello() { 
System.out.println("class A"); 
} 
} 

class B extends A { 

int a=20; 

public void sayhello() { 
System.out.println("class B"); 
} 

} 

public class HelloWorld { 
    public static void main(String[] args) throws IOException { 

B b = (B) new A(); 
    System.out.println(b.a); 
    } 
} 

tại thời gian biên dịch nó không đưa ra lỗi, nhưng khi chạy nó sẽ hiển thị một lỗi: Exception in thread "main" java.lang.ClassCastException: Một không thể được đúc đến B

Trả lời

16

Điều này xảy ra bởi vì thời gian biên dịch loại biểu hiện của new A()A - mà thể là một tham chiếu đến một thể hiện của B, vì vậy các diễn viên được cho phép.

Tuy nhiên, tại thời điểm thực thi, tham chiếu chỉ là một phiên bản A - vì vậy, nó không thành công. Một ví dụ về chỉ Akhông phải là một phiên bản của B. Các diễn viên chỉ hoạt động nếu tham chiếu thực sự tham chiếu đến một thể hiện của B hoặc một phân lớp.

7

B mở rộng A và do đó B có thể được truyền dưới dạng A. Tuy nhiên, điều ngược lại không đúng. Một thể hiện của A không thể được gán thành B.

Nếu bạn đến từ thế giới Javascript, bạn có thể mong đợi điều này để làm việc, nhưng Java không có "duck typing".

1

đầu tiên làm điều đó như thế này:

A aClass = new B(); 

Bây giờ làm đúc Explicit của bạn, nó sẽ làm việc:

B b = (B) aClass; 

đúc Explicit Đó của trung bình phải cần ép kiểu ngầm. Ngược lại không được phép khai thác rõ ràng.

0

Khi bạn tạo đối tượng của một lớp con, bạn không thể nhập nó vào một superClass. Chỉ cần nhìn vào ví dụ dưới đây

Giả định: Chó là lớp trẻ mà được thừa hưởng từ động vật (SuperClass)

Bình thường để định kiểu:

Dog dog = new Dog(); 
Animal animal = (Animal) dog; //works 

sai thợ đúc chư:

Animal animal = new Animal(); 
Dog dog = (Dog) animal; //Doesn't work throws class cast exception 

dưới đây để định kiểu thực sự hoạt động:

Dog dog = new Dog(); 
Animal animal = (Animal) dog; 
dog = (Dog) animal; //This works 

Một trình biên dịch kiểm tra cú pháp đó là trong thời gian chạy nội dung đang thực sự xác nhận

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