Một tuần nữa lại vừa mới trôi qua thật nhanh 🍃. Mình mong rằng chúng ta đều đã có một tuần làm việc và học tập hiệu quả. Giờ đang là mùa hè rồi, trời rất nóng, đừng quên chăm sóc cho sức khoẻ tinh thần và cả thể chất cho bản thân nhé 🍋 🍍 🥑 🏋🏻♂️ 🏃 🏊 🎶 🌳
Đợt này mình đang ôn lại một số kiến thức nền tảng để phục vụ cho công việc sắp tới. Nói là ôn lại nhưng gần như là học mới, vì mình chẳng còn nhớ gì mấy. Việc học cũng trở nên khó hơn so với hồi mà mình còn trẻ hơn bây giờ 👵, sức tập trung của mình cũng giảm đi nhiều sau nhiều năm đi làm mà biếng học 🦥. Mọi thứ khó hơn, nhưng mình vẫn đang cần cù bù lại và không bỏ cuộc.
Cơ mà mình vẫn trăn trở lắm, tại sao đã xinh đẹp rồi mà lại còn phải học giỏi…
Bài hôm nay mình ghi lại những kiến thức mình đã học được về Object-Oriented Programming (OOP) và Access Modifier trong Java.
Các bạn có kiến thức về mảng này muốn discuss hoặc feedbacks cho mình thì hãy comment xuống dưới bài viết nhé. Nội dung mình trình bày có thể sai hoặc chưa hoàn toàn chính xác, mình rất appreciate thời gian mà các bạn đã dành ra để đọc bài này và mình mong được feedback để tiến bộ hơn.
OOP - Lập trình hướng đối tượng.
Là gì?
Là một kiểu lập trình dựa vào đối tượng (object), cho phép người lập trình chia chương trình thành các đối tượng, mỗi đối tượng đảm nhiệm một việc nhất định, cho phép tái sử dụng ở nhiều nơi và mở rộng chức năng cho các đối tượng đó mà không làm ảnh hưởng đến nhau, tránh trùng lặp, đồng thời giúp việc quản lý và bảo trì chương trình trở nên dễ dàng hơn.
Một đối tượng sẽ chứa các thuộc tính (attributes/ properties), và phương thức (methods).
Ví dụ như:
Nhà mình có cái nồi cơm điện của hãng Cuckoo, nhà bà mình có một cái của hàng Electrolux, nhà bác mình có một cái của Sharp. Những cái nồi này đều có chức năng chính là nấu cơm. Mình thì chỉ dùng vào mỗi việc nấu cơm thôi, nhưng nhà bà mình còn dùng hấp rau củ quả, nhà bác mình thì ninh xương.
Thế thì mấy cái nồi này có đặc điểm chung là chúng đều là nồi cơm điện, vậy ta có một đối tượng (object) là “nồi cơm điện”.
Chúng có nguồn gốc xuất xứ, vậy ta có đặc tính (property) là nguồn gốc (brand). Ngoài ra chúng còn có cả màu sắc, giá thành, kích thước nữa.
Chúng thực hiện được nhiều việc như nấu cơm, ninh xương, hấp rau củ quả, ta gọi các việc đấy là phương thức (methods).
Tại sao?
Thế tại sao dăm ba cái nồi cơm điện thì lại phải properties với chả methods.
Thì ấy là ví dụ mình bịa ra thôi…
Bây giờ tưởng tượng bạn phải tạo ra 1000 cái nồi cơm mà phải đi khắp thế gian để lấy từng nguyên vật liệu, và sơn màu cho từng cái nồi một thì sẽ tốn rất nhiều thời gian và công sức.
Vậy bây giờ có vài cái xưởng chuyên cung cấp nguyên vật liệu đặc thù. Một xưởng cung cấp nguyên vật liệu phần lõi, một xưởng cung cấp nguyên vật liệu phần vỏ, xưởng khác cung cấp màu sơn. Nếu bạn cần tạo ra 1 cái nồi cơm có lõi nhôm vỏ nhựa và màu đỏ, thì chỉ cần gọi đến các xưởng đó thôi.
Nếu bạn cần viết chương trình để kiểm tra cái nồi A có dùng để ninh xương được như cái nồi B không, thì việc dùng chung một chương trình kiểm tra cho cả 2 cái nồi có phải sẽ tiết kiệm thời gian hơn không?
Kiểu kiểu vậy…
Như thế nào?
Thôi quên cái nồi cơm đi, giờ mình quay sang tìm hiểu OOP có những tính chất nào và dùng vào việc gì nhé.
Tính đóng gói (Encapsulation)
Trong thực tế, các object không đứng riêng lẻ. Chúng nằm trong các lớp (class). Đóng gói là việc đưa những dữ liệu và phương thức quan trọng vào bên trong một đối tượng (object). Khi cần dùng ta chỉ việc gọi tên chúng ra mà không làm ảnh hưởng đến dữ liệu bên trong.
Mục đích của việc đóng gói các class này là:
Tránh quyền truy cập trực tiếp đến các phần tử bên trong của đối tượng vì có thể gây ra những sửa đổi không mong muốn.
Có thể sao chép lại các object này để dùng cho một mục đích cụ thể.
Ví dụ:
Tính trừu tượng (Abstraction)
Tính trừu tượng giúp ẩn đi các chi tiết triển khai hoặc thành phần của một chương trình. Giả sử mình đề-pa ô tô và ô tô lăn bánh lên dốc thì mình chỉ biết là nó lên được dốc thôi, không biết nguyên lý hoạt động của máy móc là như thế nào.
Cách hoạt động: Trong Java, chúng ta dùng abstract class và interface để thực hiện tính trừu tượng.
Interface
Ví dụ: tạo ra 1 cái interface trong đó có chứa các methods, các methods này sẽ rỗng vì chức năng của cái interface này là một cái khung.
Tất cả method trong một Interface đều là abstract method
Class A muốn dùng methods của interface B thì cần implements B, và Override (tức là viết lại) các methods của B để dùng.
Các biến trong 1 interface thì phải là các hằng số.
Access modifier của methods và properties trong 1 interface thì luôn là và phải là public.
Abstract class
Abstract class có thể chứa cả non-abstract và abstract method
Không thể khởi tạo được object từ abstract class mà class nào muốn dùng method của abstract class thì cần thông qua kế thừa (extends) và Override lại abstract method, với non-abstract method thì không cần Override.
Tính kế thừa (Inheritance)
Bản thân mỗi object là unique nhưng chúng có thể có những thuộc tính giống nhau hoặc có các phương thức giống nhau. Tính kế thừa giữa các class cho phép một class A(class con/ sub-class) có thể truy cập những thuộc tính và method của class B (class cha/ super class) để dùng, trong khi bản thân class A vẫn có thuộc tính và phương thức riêng của nó.
Trong Java, một class chỉ có thể kế thừa một class duy nhất (single inheritance) do Java không hỗ trợ đa kế thừa. Ta dùng từ khoá extends để biểu diễn một class kế thừa một class khác.
Tính đa hình (Polymorphism)
Tính đa hình cho phép 1 object được tham chiều bằng nhiều kiểu khác nhau. Ví dụ dưới đây là tham chiếu trong lúc chương trình đang biên dịch:
Access Modifier
Access Modifier trong Java được sinh ra dùng để kiểm soát phạm vi truy cập đến một class, phương thức và dữ liệu trong class đó.
Bao gồm có 4 kiểu như hình dưới đây:
Class access modifier
Một class A có quyền truy cập đến một class B thì class A sẽ có quyền:
Khởi tạo một đối tượng mới của class B.
Kế thừa các thuộc tính và phương thức của class B.
Truy cập được vào các thuộc tính và phương thức của class B.
Nhưng với mỗi loại class access modifier sau đây lại có phạm vi truy cập riêng.
default class
Không sử dụng từ khoá gì khi khởi tạo class.
Cho phép kế thừa.
Cho class khác truy cập thông qua khởi tạo đối tượng.
public class
Sử dụng từ khoá public khi khởi tạo class.
Cho phép tất cả các class cùng và khác package truy cập và tạo mới object.
Property and Method modifier
Bảng sau thể hiện phạm vi truy cập properties và methods theo từng kiểu access modifier:
private
chỉ được truy cập trong phạm vi chính class đó
default
cho phép truy cập trong phạm vi chính class đó, và từ class cùng package
protected
cho phép truy cập trong phạm vi chính class đó, từ class cùng package, và từ sub-class thông qua kế thừa.
public
cho phép truy cập trong phạm vi chính class đó, từ class cùng package, từ class khác package thông qua khởi tạo object, và từ sub-class thông qua kế thừa.
Dưới đây là ví dụ khi một class kế thừa một class khác thì access modifier sẽ ảnh hưởng đến phạm vi truy cập đến các phương thức và thuộc tính của class cha như thế nào
Viết tới đây thì mình mệt quá rồi 😹. Hẹn gặp lại các bạn ở bài viết tới nhé. Chúc chúng ta một cuối tuần vui vẻ. Bye~~
Tác giả có thể giải thích thêm khái niệm package dùng trong bài này không ạ? Đoạn cuối cảm thấy lười dần đều, không còn sự dí dỏm, minh hoạ ở đầu bài :v
Bài viết rất công phu và dễ hiểu!