2012-07-30 39 views
5

Tôi đã xem qua một số mã và không thể hiểu một khía cạnh nào đó của nó mặc dù tôi đã thực hiện một số tìm kiếm mở rộng!Tại sao dấu ngoặc đơn được sử dụng quanh tên lớp trong Java?

Câu hỏi của tôi là: tại sao các lớp học đôi khi được khai báo trong ngoặc đơn như trong mã sau?

public class Animal { 

    public static void hide() { 
     System.out.println("The hide method in Animal."); 
    } 

    public void override() { 
     System.out.println("The override method in Animal."); 
    } 
} 

public class Cat extends Animal { 

    public static void hide() { 
     System.out.println("The hide method in Cat."); 
    } 

    public void override() { 
     System.out.println("The override method in Cat."); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     Animal myAnimal = (Animal)myCat; 
     myAnimal.hide(); 
     myAnimal.override(); 
    } 
} 

nơi tập trung của tôi là trên dòng mã này nói riêng:

  Animal myAnimal = (Animal)myCat; 

tôi tin rằng nó có cái gì để làm với thực tế là một lớp mở rộng khác nhưng không chắc chắn những gì các lớp được định nghĩa trong ngoặc biểu thị.

Bất kỳ trợ giúp nào về điều này đều được đánh giá cao. Cảm ơn bạn trước.

+0

Đó là một typecast nhưng trong trường hợp này các typecast là không cần thiết - kể từ 'Cat' là một loại phụ của động vật. Các kiểu nhập là cần thiết khi bạn muốn chỉ định Siêu loại cho Loại phụ, ví dụ: 'Cat cat = (Cát) someAnimal;'. Nếu bạn làm điều này, bạn sẽ phải đảm bảo rằng trong Biến hoặc 'Cat' hoặc một loại phụ' Cat' được chứa, ví dụ: sử dụng 'instanceof'. Nếu không, Java sẽ ném một 'ClassCastException'. –

+0

trong trường hợp cụ thể này, vì Cat mở rộng Animal và myAnimal đã là Animal, bạn không cần phải cast myCat vào Animal. Vì vậy, Animal myAnimal = myCat; sẽ làm việc. – Shark

+0

ngoặc vuông '[]' - dấu ngoặc nhọn '{}' - dấu ngoặc đơn '()' - "dấu ngoặc nhọn" '<>' –

Trả lời

8

Những gì bạn đang thấy là một diễn viên để nói với trình biên dịch là ok để gán một con mèo cho một động vật.

Hành vi dành cho các trường hợp trình biên dịch không thể chuyển đổi an toàn loại này sang loại khác, vì nó không biết loại liên quan là gì, hoặc vì phôi sẽ mất thông tin (ví dụ, nếu bạn có gấp đôi mà bạn muốn lưu trữ trong một biến kiểu float). Trong ví dụ của bạn, diễn viên hoàn toàn không cần thiết vì Cat mở rộng Animal; vì tất cả các con mèo đều là Động vật, trình biên dịch không cần một diễn viên rõ ràng để nói nó có thể gán một con mèo cho một con vật.

7

Đây là một diễn viên - biến số myCat thuộc loại Cat đang được truyền tới lớp cơ sở Animal.

Điều này có nghĩa là nó có thể được coi là Animal.

Đây là chức năng cơ bản của inheritance bằng Java.


Như @Sebastian Koppehelcommented, các diễn viên trong trường hợp này là không cần thiết - các myAnimal biến (kiểu Animal) có thể chấp nhận bất kỳ loại mà thực hiện Animal.

+1

Và tính năng cơ bản của kế thừa này có nghĩa là dàn diễn viên * không cần thiết * trong trường hợp này. Bạn cần phôi khi bạn biết một đối tượng là của một lớp nhất định nhưng trình biên dịch không thể biết rằng vì một lý do nào đó. Trong trường hợp này trình biên dịch biết nó và dàn diễn viên chỉ là cú pháp. –

+0

Vì vậy, thực tế là 'Cát' kéo dài 'Động vật' làm cho đúc vô nghĩa? I E. làm cùng một công việc? – Sidz

+0

@ Sadiq_S86 - Về cơ bản, có. Diễn viên là không cần thiết. – Oded

0

Bạn đang bảo đảm rõ ràng trình biên dịch/thời gian chạy mà loại tham chiếu mèo bạn đang chuyển là loại Động vật. Trong java, nó được gọi là truyền.

Trong khi thời gian chạy nếu hợp đồng này không được tôn trọng (Điều đó có nghĩa là không có mối quan hệ nào được xác định giữa mèo và Động vật), bạn sẽ nhận được ClassCastException.

1

Mặc dù mã tạo ra đầu ra chính xác, nếu bạn phải đưa đối tượng vào lớp cha và sau đó gọi phương thức tĩnh của lớp cha, các lớp có thể cần phải được thiết kế tốt hơn. Thừa kế trong Java được cho là cung cấp quyền truy cập vào các phương thức và trường phổ biến. Nếu người ta cần mã một phương thức tĩnh trong một lớp cha và gọi nó bằng cách sử dụng đối tượng của các lớp con, thì mối quan hệ giữa lớp cha và lớp con không rõ ràng.

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