Hỏi về Reference Variable Type trong Java

Mình cũng hiểu ý bạn.
Ý mình tức là thế này: Chúng ta có 1 biến kiểu Animal để lưu trữ địa chỉ của đối tượng của class Horse, và biến kiểu Animal này là biến tham chiếu, khi tham chiếu đến biến animal ta sẽ được địa chỉ của đối tượng của class Horse. Mà thực chất thì biến animal chính là 1 con trỏ đang trỏ đến đối tượng Horse.
Về việc tại sao lại gọi run() báo lỗi, theo mình nghĩ như này:

  • Đối tượng của class Animal sẽ lưu trữ 100 bytes (giả dụ).
  • class Horse kế thừa từ class Animal nên nó sẽ kế thừa 100 bytes của class Animal và nó có thêm 50 bytes riêng của nó (vì nó có thêm phương thức run()).
  • Bởi vì biến animal có kiểu Animal nên biến animal chỉ đọc được 100 bytes của đối tượng của class Horse, và trong 100 bytes đó không có phương thức run() nên nó không thực hiện được.
    Mình biết ít nên có gì pro sửa giúp. Thanks
4 Likes

làm sao mà các bác có thể biết rõ nó như thế vậy, ở trường mình chỉ dạy làm như thế nào chứ không có rõ ràng như vậy :frowning:

đọc sách, tìm diễn đàn về ngôn ngữ đó đoc, viết code demo. chạy debug để coi lỗi sai. Trường dạy chỉ lý thuyết không làm sao biết đúng sai.

https://drive.google.com/file/d/0B9jVt0SX-XdeVFZya3lvWlNSWTQ/view?usp=sharing

Những gì bạn cần…

1 Like

Ở trường không thể dạy sâu như thế này được vì rất tốn time và không cần thiết :). Họ chỉ dạy bác biết nó là gì, hiểu cơ bản thôi. Còn bác muốn hiểu sâu hơn thì phải đọc thêm sách.

bác download Book ở trong bài viết này, nó nói rất rõ đó.
Hoặc là đọc bản mới hơn của bác @GDGHN_AndroidTeam (Java7).

Cảm ơn các bác, cơ mà tiếng anh đang cùi lắm chưa thể tự hiểu được

Moị người giải thích giùm em là tại sao trong trường hợp này khi chạy lệnh b.move() lại chạy method move() trong class Dog mà không bị lỗi như ví dụ của anh Cương Nguyễn ạ.

Vấn đề mà mọi người thảo luận ở đây là về Method Call Binding trong Java.
Có thể hiểu đơn giản về ví dụ của Cương Nguyễn và bạn Duy Nguyen như sau:
Đầu tiên Animal animal = new Dog(); thì animal là một biến kiểu Animal và có giá trị là 1 object Dog.
Viết lệnh animal.run() thì Java tại thời điểm biên dịch sẽ kiểm tra đến hàm run() của class Animal trước và không có nên báo lỗi ở ví dụ của bạn Cương Nguyễn.
Nếu Animal có hàm run() thì compile time không báo lỗi và tại run time Java sẽ kiểm tra đến class Dog là giá trị của biến, nếu không có thì chạy run() của Animal nếu có thì chạy hàm đã được override lại của Dog.

Developer javaDev = new JavaDeveloper();
Developer newDev = javaDev;
javaDev = new JavaDeveloper();

Trong này, mình có thắc mắc là biến javaDev ở dòng thứ 1 và thứ 3 đều trỏ tới JavaDevloper mà lại bị coi là khác nhau vậy ae nhỉ?

nó trỏ đến 2 vùng nhớ khác nhau trên heap đó chứ …

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?