Sự Khác Nhau Giữa Class Và Object / Top 4 # Xem Nhiều Nhất & Mới Nhất 2/2023 # Top View | Channuoithuy.edu.vn

Sự Khác Biệt Giữa Class Và Object Trong Java

Class và Object là hai khái niệm quan trọng nhất của ngôn ngữ lập trình hướng đối tượng (OOP), ví dụ Java. Sự khác biệt chính giữa một Class và một Object trong Java đó là Class nó là một bản thiết kế chi tiết để tạo ra các đối tượng khác nhau cùng loại. Điều này có vẻ đơn giản với nhiều bạn nhưng nếu bạn là người mới bắt đầu hoặc chỉ nghe thuật ngữ “Ngôn ngữ lập trình hướng đối tượng” thì có thể không đơn giản như vậy. Tôi đã gặp nhiều sinh viên, người mới bắt đầu và lập trình viên, những người không biết sự khác biệt giữa lớp và đối tượng và thường sử dụng chúng thay thế cho nhau. Ngoài ra API Java có các lớp như java.lang.Object và java.lang.Class cũng gây thêm nhiều nhầm lẫn cho những người mới bắt đầu. Cả hai đều là những thứ hoàn toàn khác nhau, lớp và đối tượng trong OOP là các khái niệm và có thể áp dụng cho tất cả các ngôn ngữ lập trình hướng đối tượng khác, ví dụ như C++ hoặc Scala. Mặt khác, java.lang.Class và java.lang.Object là một phần của API Java. Cùng với các khái niệm OOP khác như Tính trừu tượng, Đóng gói, Kế thừa và Đa hình, đây cũng là một trong những điều cơ bản nhất của lập trình hướng đối tượng cần được hiểu rõ ràng trước khi tiến hành lập trình. Nếu không hiểu rõ về Class và Object, bạn sẽ dễ mắc lỗi hơn, bạn không thể hiểu được chương trình đã viết và bạn sẽ rất khó tìm ra lỗi hoặc sửa lỗi hoặc xử lý các ngoại lệ trong code của bạn. Hơn nữa sự khác biệt giữa lớp và đối tượng cũng là một câu hỏi phỏng vấn lập trình rất phổ biến, thường được hỏi ở các cuộc phỏng vấn.

Sự khác biệt giữa Class và Object trong Java

1) Lớp là bản thiết kế có nghĩa là bạn có thể tạo các đối tượng khác nhau dựa trên một lớp khác nhau.

Xe là tổng quát hơn so với Mercedes, BMW hay Audi có thể được coi là đối tượng vì thực chất chúng là đề là xe nhưng có kích thước, hình dạng, màu sắc và tính năng khác nhau.

2) Một lớp có thể tương tự như cấu trúc (struct) trong ngôn ngữ lập trình C với sự khác biệt duy nhất là cấu trúc không chứa bất kỳ phương thức hoặc hàm nào, trong khi lớp trong Java chứa cả trạng thái và hành vi, trạng thái được biểu thị bằng trường trong lớp. Còn hành vi được điều khiển bởi các chức năng, còn được gọi là các phương thức trong Java, ví dụ start() sẽ thay đổi trạng thái của xe từ dừng sang bắt đầu hoặc chạy và stop() sẽ làm ngược lại.

3) Đối tượng cũng được gọi là cá thể trong Java và mọi cá thể có các giá trị khác nhau.

ví dụ như trong đoạn code sau:

class Person { private String name; public Person(String name) { chúng tôi = name; } public String getName() { return name; }}Person p1 = new Person("Rakesh");Person p2 = new Person("Jimmy");Person p3 = new Person("Peter");

Ở đây Person là một lớp vì nó định nghĩa thiết kế các đối tượng person, tức là lớp Person sẽ quy định một đối tượng person sẽ trông như thế nào, nó sẽ có thuộc tính gì, v.v… Bằng cách đó, lớp được khai báo bởi từ khóa “class” trong Java và p1, p2, p3 là các đối tượng khác nhau của lớp Person . Một điểm khác biệt giữa Class và Object trong Java là chúng ta có từ khóa class để khai báo lớp nhưng không có từ khóa đối với đối tượng. Các đối tượng được tạo đáng chú ý nhất bằng toán tử new(), gọi constructor của lớp để khởi tạo đối tượng trong Java.

Đó là tất cả về sự khác biệt giữa Class và Object trong Java. Như tôi đã nói sự khác biệt chính giữa lớp và đối tượng là Class là một thiết kế của một nhóm các đối tượng mà có các thuộc tính chung trong khi Object là một thực thể là một instance (ví dụ,trường hợp) của một lớp . Lớp sẽ xác định một đối tượng sẽ trông như thế nào và đối tượng thuộc về một lớp cụ thể. Trong ngôn ngữ lập trình hướng đối tượng, bạn có thể tìm thấy các ví dụ thực tế về lớp và đối tượng trong môi trường xung quanh, ví dụ: Nhà có thể là một lớp và nhà của bạn có thể được coi là đối tượng của lớp nhà, vì chúng là nhà nhưng nhà của bạn sẽ khác với các nhà khác.

Phần 22: Class Và Object

Ở phần trước chúng ta đã đề cập tới định nghĩa và các tính chất của Lập trình Hướng đối tượng (OOP). Trong phần này chúng ta sẽ bắt đầu ứng dụng những lí thuyết ấy vào thực hành với C++.

Hãy đọc lại bài Cấu trúc dữ liệu – struct và class. Cài đặt class cũng gần giống như struct, ta sử dụng cú pháp sau:

Ví dụ

Vậy có gì khác biệt giữa struct và class? Có 2 sự khác biệt ở đây

Về mặt ngữ nghĩa, struct thường được sử dụng để định nghĩa các kiểu dữ liệu Plain-Old-Data (dữ liệu không, không bao gồm các chương trình con hay các yếu tố đóng gói). class thường được sử dụng trong lập trình OOP đầy đủ.

Quyền truy cập mặc định tới các yếu tố trong struct là public, còn với class là private.

struct có thể chỉnh sửa được thành class và ngược lại, và có thể sử dụng được các yếu tố của OOP như nhau. Để thống nhất, từ nay trở đi ta sẽ chỉ sử dụng class.

Sau khi định nghĩa class xong, ta có thể định nghĩa các object như các biến thông thường.

Ta cũng truy cập các yếu tố public của object bằng toán tử dấu chấm ..

Ở trên ta có nhắc tới quyền truy cập. Đối với các yếu tố trong class, quyền truy cập mặc định là private – các yếu tố trong class chỉ có thể được truy cập từ nội bộ bên trong class, và từ bên ngoài không thể gọi vào.

Ngoài private ra, còn có 2 kiểu quyền truy cập khác:

public: Yếu tố public có thể được truy cập từ bên ngoài đối tượng.

protected: Yếu tố protected không thể được truy cập từ bên ngoài đối tượng, nhưng có thể truy cập được từ các đối tượng thuộc class con của class hiện tại. Class con và sự thừa kế sẽ được đề cập kĩ hơn trong các bài viết sau.

Để có thể thiết lập quyền truy cập cho đối tượng, ta sử dụng các từ khóa private, public và protected đi kèm cùng dấu hai chấm :. Các yếu tố tiếp theo sau từ khóa sẽ được áp dụng quyền truy cập tương ứng, cho tới khi có một từ khóa mới xuất hiện.

Trong class ví dụ ở trên, void privateVoid() chỉ có thể được gọi từ bên trong đối tượng thuộc vào class Cat, void publicVoid() có thể gọi được từ bất kì đâu, còn void protectedVoid() chỉ có thể gọi từ bên trong đối tượng thuộc class Cat, hoặc các đối tượng thuộc vào class con của Cat.

Đây chính là encapsulation – tính đóng gói của lập trình hướng đối tượng. Với cách đặt quyền truy cập cho các yếu tố trong class, ta có thể giới hạn sử dụng của class tới những chức năng cần thiết đối với bên ngoài.

Tương tự đối với struct, ta cũng có thể viết hàm khởi tạo để khởi tạo các yếu tố của object thuộc class. Ví dụ:

Output

Hàm phá hủy (destructor) là một loại chương trình con đặc biệt khác, được gọi ra khi object bị phá hủy (ví dụ: khi chương trình kết thúc và bộ nhớ được giải phóng). Hàm phá hủy được định nghĩa theo cú pháp

Ví dụ như khi áp dụng vào class Cat ở trên:

Output

Ta có thể sử dụng destructor để dọn dẹp dữ liệu sau khi đối tượng bị phá hủy, lưu trữ thông tin quan trọng, vân vân…

Copy constructor là một loại hàm khởi tạo đặc biệt – nó được gọi ra khi một object của class được gán giá trị bằng một object khác (ví dụ như khi gán bằng nhau, khi đặt giá trị cho tham số của hàm, vân vân). Khi đó ta có thể sử dụng copy constuctor để can thiệp vào quá trình gán đó.

Một class thường không bắt buộc phải có copy constructor – trình dịch sẽ tự động xử lý việc gán nếu như không có, tuy nhiên các class có biến kiểu con trỏ và có khả năng cấp phát bộ nhớ động thì bắt buộc phải có copy constructor.

Cú pháp của copy constructor là

const là từ khóa hằng số – nó mang ý nghĩa rằng biến được khai báo sau nó là hằng số và sẽ không bao giờ bị thay đổi. Chú ý kiểu dữ liệu ở đây là truyền tham biến (toán tử &).

Ví dụ:

Output

Tất cả các object thuộc class đều có thể truy cập tới giá trị con trỏ bộ nhớ của mình thông qua từ khóa this. Ví dụ:

Hai giá trị được in ra sẽ khác nhau, do hai đối tượng được lưu ở hai vị trí bộ nhớ khác nhau.

Các thao tác đối với con trỏ bộ nhớ trên class cũng tương tự như với struct.

Giả sử bây giờ ta muốn đếm số lượng object Cat đã được sử dụng trong chương trình. Ta có thể sử dụng một biến global catNumber, và mỗi khi chạy hàm khởi tạo một object Cat thì ta tăng catNumber lên một. Tuy nhiên mỗi khi sử dụng class Cat, ta sẽ lại phải khai báo bên ngoài một biến catNumber, trong khi rõ ràng biến catNumber này vẫn luôn luôn gắn kèm về mặt ý nghĩa với class Cat. Điều này có thể sinh ra nhiều rắc rồi trong tương lai.

Giải phải là thay vì để catNumber là một biến global, ta sẽ khai báo catNumber thành một biến tĩnh – static – của class. Các yếu tố static hoàn toàn độc lập với các object của class – cho dù có bao nhiêu object thuộc class trong chương trình, các yếu tố static sẽ luôn luôn chỉ có một, và có thể truy cập thông qua toán tử :: (toán tử truy cập scope).

Các biến static sẽ được khởi tạo cùng với object đầu tiên được tạo ra của class. Nếu như chưa có object nào được tạo ra, nhưng ta vẫn muốn truy cập vào biến static, ta phải khai báo giá trị của biến static ở bên ngoài, sử dụng toán tử ::.

Tương tự, ta cũng có thể định nghĩa các chương trình con static độc lập với toàn bộ object của class bằng từ khóa static.

Ví dụ:

Output

Một ứng dụng quan trọng của các yếu tố static là Design Pattern Singleton – thiết kế chương trình đảm bảo chỉ có một object của class tồn tại trong suốt quá trình chạy của chương trình.

Giả sử ta có một class rất to và nặng, chỉ cần tạo ra một lần trong toàn bộ chương trình (ví dụ như database). Khi đó ta sẽ lưu một object của class đó dưới dạng static, và cho phép gán giá trị của object static này cho các đối tượng thông qua một hàm getInstance() thay vì phải khởi tạo lại từ đầu.

Phần sau: [C++ Cơ bản] Phần 23: Tính thừa kế – Class con (subclass)

Sự Khác Nhau Giữa Abstract Class Với Interface Trong Java.

Sự khác nhau giữa Abstract class với Interface trong Java

Abstract Class – Interface

Bạn vẫn nghe trong Java không hỗ trợ đa thừa kế (nhằm tránh sự phức tạp, xung đột code)

và để nhằm khắc phục vấn đề đó ta dùng interface (Cho phép nhiều class implements nhiều interface).

Vậy sự khác nhau giữa abstract class với interface là gì, cách dùng chúng trong mỗi trường hợp ra sao?

1. Ý nghĩa của abstract class và interface

abstract class:

Bạn nên nhớ Java là ngôn ngữ hướng đối tượng, dùng abstract class nó mang ý nghĩa là thừa kế bản chất của đối tượng. Ví dụ Student extends Personhoàn toàn hợp lý vì học sinh và người đều cùng bản chất, nhưng Student extends Car lại không hợp lý, vì học sinh và ô tô khác hoàn toàn nhau về bản chất.

interface:

Khi nói tới interface người ta thường dùng cho hành động nhiều hơn

Với abstract class thì người ta sẽ gộp chung các thuộc tính lại, còn với interface thì người ta sẽ gộp chung các hành động lại.

Túm lại:

Abstract class thiên về bản chất của đối tượng (các thuộc tính)

Interface thiên về các hành động của đối tượng (các method).

2. Sự khác nhau trong cài đặt abstract class và interface

Từ ý nghĩa mà abstract class với interface cũng có những khác nhau trong cài đặt:

Abstract class Interface

1 abstract class chỉ có thể extends 1 và chỉ một class /abstract class khác 1 interface có thể extends nhiều interface khác; interface chỉ có thể extends interface không thể extends class

Trong abstract class có thể có concrete method hoặc abstract method Trong interface, mọi method đều là abstract method

(*Từ Java 8 cho phép thêm method không phải là abstract vào interface bằng từ khóa default)

Trong abstract class khi muốn tạo abstract method bắt buộc phải có từ khóa abstract  Từ khóa abstract có thể có hoặc không.

abstract method trong abstract class có thể là public hoặc protected abstract method trong abstract class chỉ có thể là public

(*Từ Java 9 cho phép thêm method private và private static vào Interface)

Trong abstract class, các thuộc tính có thể final, static, public, private, protected Trong Interface, mọi thuộc tính đều là public static final

Sự khác nhau giữa Abstract class với Interface trong Java.

References:

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

Sự Khác Biệt Giữa Abstract Class Và Interface

Cả Abstract class và Interface đều được sử dụng để đạt được sự trừu tượng nơi chúng ta có thể khai báo các phương thức trừu tượng. Cả Abstract class và Interface đều không thể được khởi tạo.

Nhìn chung, chúng khá giống nhau, nhưng có nhiều điểm khác biệt giữa Abstract class và Interface khiến nó được sử dụng ở những trường hợp khác nhau.

Sự khác biệt đơn giản, abstract class có thể đạt được trừu tượng một phần (0 đến 100%) trong khi interface đạt được mức trừu tượng hoàn toàn (100%).

Ghi chú: Nếu bạn đang tích cực học Java, KHÓA HỌC LẬP TRÌNH JAVA với sự hướng dẫn của chuyên gia doanh nghiệp này chắc chắn sẽ giúp bạn học tập nhanh hơn, bài bản hơn.

Ví dụ về Abstract class và Interface trong JAVA

Hãy xem một ví dụ đơn giản trong đó chúng ta đang sử dụng cả interface và lớp trừu tượng.

interface A{ void a(); void b(); void c(); void d(); } abstract class B implements A{ public void c(){ System.out.println("Tôi là C"); } } class M extends B{ public void a(){ System.out.println("Tôi là a"); } public void b(){ System.out.println("Tôi là b"); } public void d(){ System.out.println("Tôi là d"); } } class Test{ public static void main(String args[]){ A a = new M(); a.a(); a.b(); a.c(); a.d(); } }

Kết quả:

Tôi là a Tôi là b Tôi là C Tôi là d

Tổng kết

Như vậy là trong và viết này mình đã giúp bạn tìm hiểu rõ sự khác nhau của Abstract class và Interface trong Java.