Toàn tập kế thừa (extends) trong Java

Written by IT Phú Trần on 09/08/2017 in Câu hỏi phỏng vấn and JAVA CORE and KINH NGHIỆM LẬP TRÌNH and LẬP TRÌNH JAVA with 65 comments.

Một trong những kiến thức khá quan trọng nhất trong lập trình Java đó chính là tính kế thừa (extends) trong Java. Đây là kiến thức bạn bắt buộc phải học và hiểu cơ chế, ý nghĩa của nó để có thể áp dụng trong ứng dụng của bạn.

Khi chúng ta nói về tính kế thừa, từ khóa thường xuyên nhất được sử dụng là extends trong java và implements trong java. Tất nhiên sẽ có sự khác biệt giữa 2 từ khóa này. Các bạn có thể xem bài viết phần biệt giữa extends và implements tại đây. Trong bài này tôi sẽ cụ thể hóa và nói kỹ về extends trong Java nhé.

Tại sao sử dụng tính kế thừa trong Java?

Chẳng hạn như Tôi có class Sach gồm 2 thuộc tính là mã và tên của sách, nhưng bây giờ tôi cũng có một class khác là SachLapTrinh, với sách lập trình thì nó cũng có hai thuộc tính là mã và tên của sách, vậy bây giờ vấn đề đặt ra là tôi phải tạo class SachLapTrinh như class Sach gồm 2 thuộc tính trên hay có cách nào để giải quyết bài toán này một cách đơn giản mà không cần tạo 2 thuộc tính trên? Câu trả lời là có. Chúng ta sẽ sử dụng tính kế thừa trong Java.

Để cụ thể và dễ hiểu, hình dùng với ví dụ trên, các bạn xem code bên dưới:

Class Sach:

Class SachLapTrinh :

Cú pháp của tính kế thừa trong Java

Từ khóa extends có ý nghĩa rằng bạn đang tạo một lớp mới và kế thừa từ một lớp đang tồn tại.Trong Java, một lớp mà được kế thừa được gọi là lớp cha, lớp kế kế thừa là lớp con.

Ví dụ tính kế thừa trong Java

Như vậy với ví dụ trên: Sach là lớp cha, SachLapTrinh là lớp con.

Bây giờ chúng ta cùng nhau test tính kế thừa nhé:

tính kế thừa trong Java

Mặc dù chúng ta đã kế thừa từ lớp Sach, nhưng SachLapTrinh không có những thuộc tính của lớp cha và như ví dụ trên sẽ bị lỗi. Nhìn kỹ lại code trên, các bạn thấy rằng những thuộc tính của lớp cha pham vi truy cập là private nên chỉ có phạm phi trong class Sach mới sử dụng được thôi. Cho nên chú ý thứ nhất khi kế thừa trong Java là :

Chúng ta sử dụng từ khóa extends của lớp con để có thể kế thừa các thuộc tính của lớp cha trừ các thuộc tính private của lớp cha. 

Tất nhiên các bạn để phạm vi truy cập là public tất nhiên Class SachLapTrinh sẽ kế thừa được những thuộc tính đó. Tuy nhiên vì tính bao đóng trong Java nên khuyên các bạn chúng ta nên khai báo thuộc tính là private. Java cũng khuyến cáo chúng ta như vậy và tất nhiên các lập trình viên cần phải có ý thức để thuộc tính là private.

Tiếp theo tôi sẽ viết một số phương thức ở lớp cha, cho người dùng nhập vào mã và tên sách và phương thức dùng để in.

chạy chương trình ở lớp con (class SachLapTrinh) như sau:

và tất nhiên kết quả sẽ như mong đợi:

kế thừa trong java

 

Như vậy, các bạn thấy kế thừa thật tuyệt vời đúng không nào, class SachLapTrinh chả code gì cả nhưng vẫn có những hàm như nhap(), toString(). Qúa đó , ta thấy được rằng :

Chúng ta sử dụng từ khóa extends của lớp con để có thể kế thừa các phương thức của lớp cha.

Vậy khi làm như trên, có những gì bất cập nào? Chúng ta cùng suy nghĩ. Giả sử như ở class SachLapTrinh tôi có thêm một thuộc tính nữa là số trang (sotrang) của sách.

và tất nhiên khi chạy chương trình thì chúng ta không thể nhập được số trang.Vậy chúng ta sẽ làm thế nào? Ta sẽ viết thêm hàm nhập và hàm in cho class SachLapTrinh, đơn giản vì class Sach là lớp cha, no không thể biết là class con cần thêm những phương thức gì, những thuộc tính gì để khai báo.Cách xử lý như sau:

Ở code trên, các bạn thấy rằng chúng ta viết lại y hệt phương thức của class cha, nhưng thây vì phải nhập lại mã , tên sách, thì tôi sẽ dùng từ khóa super để gọi phương thức của lớp cha. Khi chúng ta viết lại phương thức cùng tên,cùng phạm vi truy cập và cùng kiểu dữ liệu trả về của lớp cha. Vậy khi gọi phương thức nhap() cũng như toString() thì nó sẽ chạy phương thức của lớp con.Và loại bỏ phương thức của thằng cha đi.

Với khái niệm trên chúng ta gọi đây là ghì đè trong java hay còn gọi là override.Nếu Bạn nào chưa tìm hiểu về vấn đề này thì có thể tìm hiểu tại đây. 

Thông thường thì khi sử dụng kế thừa (extends) thì chúng ta sẽ sử dụng ghì đè.

Câu hỏi :   Vì sao phải ghì đè? 

  1. Để class con đảm bảo đầy đủ các chức năng để  nó hoạt động tốt.
  2. Để đồng bộ code.

Kết quả chạy chương trình trên:

kế thừa trong java

Vậy theo các bạn phương thức setter và getter trong java có ghì đè được không? Qúa đơn giản, tất nhiên là được vì nó là một hàm bình thường. Tuy nhiên bây giờ theo các bạn, hàm đặc biệt (hàm khởi tạo hay constructor) trong java có ghì đè được không?

Trước khi trả lời câu hỏi này,  gợi ý các bạn như sau:

Constructor là hàm dùng để tạo ra object từ một class nào đấy. (đương nhiên class nào thì đi kèm với constructor của nó). 

Chắc các bạn có thể dễ dàng đoán ra được rồi với gợi ý của mình rồi chứ? Không nhé.

Nếu class SachLapTrinh ghì đè constructor của lớp Sach thì nó quá vô nghĩa và chả có tác dụng gì.

Câu hỏi:hàm đặc biệt (hàm khởi tạo hay constructor) trong java có ghì đè được không?

Trả lời :Không, nhưng lại có. (trả lời thế nhà tuyển dụng mới sợ nhé).

Giải thích như sau:

Khi tạo ra object lớp con, thì tất nhiên object lớp cha cũng được khởi tạo.Vì sao? các bạn suy nghĩ lại xem ở ví dụ trên, nếu không tạo ra object lớp cha thì lớp con sao lấy được mã, tên?

Nhìn hình minh họa trên các bạn có thể hiểu.Để tạo object Sach thì gọi constructor của class Sach.

Vậy các bạn để ý rằng ở lớp con (class SachLapTrinh) chúng ta chưa hề gọi constructor của lớp cha(Sach). Thậm chí rằng ở class con chúng ta chưa hề viết constructor.Nhưng tại sao nó vẫn chạy. Tại vì:

Nguyên tắc :

Trong constructor của class con khi extends phải gọi constructor của lớp cha, nếu không có constructor  thì hệ thống sẽ tự tạo constructor mặc định và gọi constructor của lớp cha.

để chứng minh cho vấn đề trên, ở constructor lớp cha, tôi sẽ in ra dòng chữ như sau:

Vậy khi chạy:

 

Vậy như câu trả lời của tôi, không kế thừa nhưng lại kế thừa là ở chỗ đấy. constructor  của lớp con phải bắt buộc gọi constructor  của lớp cha. Nếu không gọi thì mặc định hệ thống sẽ tư gọi.

Kết luận: super cũng dùng để gọi constructor của lớp cha.

Nhưng lại có một trường hợp trơ trêu là constructor của lớp cha không có, hoặc tôi cố tình thay phạm vi truy cập thành private thì điều gì xảy ra? Nó sẽ bị lỗi ngay, vì mặc định hệ thống sẽ gọi constructor của lớp cha, mà constructor lại không có nên đơn nhiên nó bị lỗi.(Các bạn thử thay vào trong code nhé, tôi lười chụp lại ảnh quá).

Vậy chúng ta sẽ xử lý như thế nào? 

  1. Các bạn phải tự gọi constructor của lơp cha, một constructor  nào đấy nhưng là public nhé. Ví dụ constructor  có tham số chẳn hạn.

2. Thông thường thì chúng ta không làm như thế này, mà sẽ làm như sau:

làm cách thứ hai thì nhìn vào code rất trong sang và đồng bộ.

Tôi nói thêm như vậy để các bạn hiểu bản chất, chứ thật ra chả ai viết ra constructor mà để private cả ^^.


Chưa hết , giả sử như class của lớp cha, không có constructor nào thì điều gì lại xảy ra tiếp theo?

Cái này người ta gọi là cấm kế thừa. Một trong những cách cấm kế thừa nữa là ở class các bạn muốn cấm kế thừa thêm vào từ khóa final.

Vì sao phải cấm kế thừa? Vì một số trường hợp chúng ta đã viết một số class rất hoản chỉnh rồi và cho người khác sử dụng, tất nhiên đã hoàn chỉnh rồi thì thằng nào muốn dùng thì copy class sử dụng, chứ nếu cho nó kế thừa thì uổng công sức bỏ ra viết quá nhỉ. @@.

Lưu ý: Khi kế thừa các bạn phải có ý thức kế thừa chính xác, nghĩa là ví dụ class ConMeo thì không thể extends từ class SinhVat được. Tất nhiên các bạn  code thì nó vẫn chạy nhưng sai về mặt ý nghĩa. Chúng ta là lập trình viên thì phải ý thức được điều đấy.


Đôi lời…

Bài viết trên là những kinh nghiệm của tôi, cũng như trong thực tế các bạn sẽ gặp. Hy vọng các bạn sẽ hiểu tất cả những gì được gọi là kế thừa trong java hay sang chảnh thì extends ^^.

Hẹn các bạn ở một bài viết khác.

65 Responses to “Toàn tập kế thừa (extends) trong Java

  1. Today, I went to the beachfront with my kids. I found a sea shell and gave it to my 4 year
    old daughter and said “You can hear the ocean if you put this to your ear.” She put
    the shell to her ear and screamed. There was a hermit crab inside and
    it pinched her ear. She never wants to go back!
    LoL I know this is entirely off topic but
    I had to tell someone!

  2. Hi there friends, nice piece of writing and pleasant urging commented here, I am genuinely enjoying by these.

  3. If some one wishes to be updated with newest technologies then he must be pay a visit this
    site and be up to date daily.

  4. Somebody essentially lend a hand to make severely posts I would
    state. That is the very first time I frequented your website page and so far?
    I surprised with the analysis you made to make this actual put up incredible.
    Fantastic activity!

  5. When I originally commented I clicked the “Notify me when new comments are added”
    checkbox and now each time a comment is added I
    get three e-mails with the same comment. Is there any way you can remove me from that service?
    Thank you!

  6. It’s the best time to make a few plans for the future and
    it is time to be happy. I have read this post and
    if I may I want to suggest you few interesting issues or suggestions.
    Maybe you can write next articles regarding this article. I desire to read more issues approximately it!

  7. I really like your blog.. very nice colors & theme. Did
    you design this website yourself or did you hire someone to do it
    for you? Plz respond as I’m looking to create my own blog and would like to know where u got this from.

    appreciate it

  8. I just want to mention I am new to blogging and absolutely savored this page. Likely I’m likely to bookmark your website . You actually have beneficial well written articles. Cheers for sharing with us your web site.

  9. A different issue is that video gaming became one of the all-time largest forms of excitement for people of nearly every age. Kids participate in video games, and adults do, too. The XBox 360 is probably the favorite video games systems for folks who love to have a huge variety of activities available to them, plus who like to relax and play live with others all over the world. Many thanks for sharing your notions.

  10. One more issue is that video games usually are serious anyway with the main focus on understanding rather than leisure. Although, it has an entertainment factor to keep your children engaged, every single game is normally designed to develop a specific skill set or programs, such as instructional math or technology. Thanks for your post.

  11. Thank you for all your valuable hard work on this website. Betty takes pleasure in engaging in research and it’s really obvious why. I learn all relating to the lively way you render rewarding items on this blog and even improve contribution from the others on this concept so my princess is without a doubt starting to learn a lot of things. Take pleasure in the rest of the year. You have been doing a dazzling job.

  12. I’m amazed, I have to admit. Rarely do I come across a blog that’s equally educative and entertaining, and let me tell you, you have hit the nail on the head. The issue is an issue that not enough people are speaking intelligently about. I am very happy I found this during my hunt for something relating to this.

  13. After I originally left a comment I seem to have clicked the -Notify me when new comments are added- checkbox and from now on every time a comment is added I receive four emails with the exact same comment. Is there an easy method you are able to remove me from that service? Appreciate it.

  14. May I just say what a relief to uncover someone who truly understands what they are discussing on the net. You definitely know how to bring an issue to light and make it important. More people need to look at this and understand this side of your story. I can’t believe you’re not more popular because you most certainly have the gift.

  15. I have mastered some important things through your website post. One other subject I would like to mention is that there are plenty of games available and which are designed particularly for preschool age small children. They incorporate pattern identification, colors, pets, and shapes. These generally focus on familiarization in lieu of memorization. This makes children engaged without feeling like they are studying. Thanks

  16. After I originally commented I appear to have clicked on the -Notify me when new comments are added- checkbox and from now on every time a comment is added I receive four emails with the same comment. There has to be an easy method you can remove me from that service? Many thanks.

  17. certainly like your website however you need to
    test the spelling on quite a few of your
    posts. Many of them are rife with spelling problems and I find it very bothersome to inform
    the truth however I’ll surely come again again.

  18. Hello there! Do you know if they make any plugins to safeguard against hackers?
    I’m kinda paranoid about losing everything I’ve worked hard on. Any
    suggestions?

  19. Hi, I do think this is an excellent site. I stumbledupon it 😉 I will return yet again since I saved as a favorite it. Money and freedom is the best way to change, may you be rich and continue to guide others.

  20. This is a really good tip particularly to those fresh to the blogosphere. Simple but very accurate info… Many thanks for sharing this one. A must read post.

  21. When someone writes an paragraph he/she retains the idea of a user
    in his/her brain that how a user can know it. Thus that’s
    why this article is perfect. Thanks!

  22. Hi, I do think this is a great blog. I stumbledupon it 😉 I’m going to come back yet again since i have bookmarked it. Money and freedom is the best way to change, may you be rich and continue to help other people.

  23. A fascinating discussion is worth comment. I think that you ought to publish more about this subject matter, it might not be a taboo matter but generally folks don’t talk about these topics. To the next! Cheers!

  24. I blog quite often and I truly thank you for your information. The article has really peaked my interest. I’m going to book mark your site and keep checking for new information about once per week. I opted in for your Feed too.

  25. It’s nearly impossible to find well-informed people about this topic, however, you seem like you know what you’re talking about! Thanks

  26. Howdy! I simply want to give you a big thumbs up for your great information you’ve got right here on this post. I’ll be coming back to your website for more soon.

  27. It’s hard to come by educated people about this subject, but you sound like you know what you’re talking about! Thanks

  28. Thanks for sharing superb informations. Your web-site is so cool. I’m impressed by the details that you have on this website. It reveals how nicely you understand this subject. Bookmarked this web page, will come back for more articles. You, my friend, ROCK! I found just the information I already searched everywhere and simply could not come across. What an ideal website.

  29. After looking at a few of the blog posts on your website, I truly appreciate your way of blogging. I saved it to my bookmark website list and will be checking back in the near future. Please check out my web site too and let me know how you feel.

  30. Howdy, I think your website could possibly be having internet browser compatibility problems. When I look at your site in Safari, it looks fine however, if opening in Internet Explorer, it’s got some overlapping issues. I just wanted to give you a quick heads up! Apart from that, great blog!

  31. … [Trackback]

    […] Find More Informations here: itphutran.com/toan-tap-ke-thua-extends-trong-java/ […]

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *