Đề Xuất 3/2023 # Phân Biệt Lớp Abstract Và Interface Trong Java # Top 11 Like | Cuocthitainang2010.com

Đề Xuất 3/2023 # Phân Biệt Lớp Abstract Và Interface Trong Java # Top 11 Like

Cập nhật nội dung chi tiết về Phân Biệt Lớp Abstract Và Interface Trong Java mới nhất trên website Cuocthitainang2010.com. Hy vọng thông tin trong bài viết sẽ đáp ứng được nhu cầu ngoài mong đợi của bạn, chúng tôi sẽ làm việc thường xuyên để cập nhật nội dung mới nhằm giúp bạn nhận được thông tin nhanh chóng và chính xác nhất.

Cả lớp abstract và Interface được sử dụng để thu được tính trừu tượng, từ đó chúng ta có thể khai báo các phương thức trừu tượng. Cả lớp trừu tượng và Interface không thể được khởi tạo. Nhưng cũng có các điểm khác nhau giữa lớp trừu tượng và Interface, như sau:

STT Lớp trừu tượng Interface

1 Lớp trừu tượng có thể có các phương thức abstract và non-abstract Interface chỉ có thể có phương thức abstract

2 Lớp trừu tượng không hỗ trợ đa kế thừa Interface hỗ trợ đa kế thừa

3 Lớp trừu tượng có thể có các biến final, non-final, static và non-static Interface chỉ có các biến static và final

4 Lớp trừu tượng có thể có phương thức static, phương thức main và constructor Interface không thể có phương thức static, main hoặc constructor.

5 Từ khóa abstract được sử dụng để khai báo lớp trừu tượng Từ khóa interface được sử dụng để khai báo Interface

6 Lớp trừu tượng có thể cung cấp trình triển khai của Interface Interface không cung cấp trình triển khai cụ thể của lớp abstract

6 Ví dụ: public abstract class Shape{ public abstract void draw(); }

Ví dụ: public interface Drawable{ void draw(); }

Về cơ bản, lớp trừu tượng đạt được trừu tượng hóa một phần (từ 0 tới 100%) trong khi đó Interface có thể đạt được trừu tượng hóa hoàn toàn (100%).

Ví dụ về lớp trừu tượng và Interface trong Java

interface A{ void a();//theo mac dinh, public va abstract void b(); void c(); void d(); } abstract class B implements A{ public void c(){System.out.println("Toi la C");} } class M extends B{ public void a(){System.out.println("Toi la a");} public void b(){System.out.println("Toi la b");} public void d(){System.out.println("Toi la d");} } class Test5{ public static void main(String args[]){ A a=new M(); a.a(); a.b(); a.c(); a.d(); }}

Chạy chương trình trên sẽ cho kết quả:

Toi la a Toi la b Toi la c Toi la d

Khác Biệt Giữa Abstract Class Và Interface Trong Java

1. Nguồn

What’s the difference between an interface and an abstract class in Java?

2. Động cơ

Các câu hỏi về điểm khác biệt giữa abstract class và interface luôn rất hot trong các cuộc phỏng vấn Java cũng như Android developer, hy vọng qua bài viết này sẽ tóm tắt được những điểm khác biệt lớn và rõ ràng nhất của chúng, từ đó giúp các bạn developer có lựa chọn đúng đắn trong khi code.

3. Bài viết

Cách tốt nhất để bắt đầu phân biệt điểm khác giữa abstract class và interface chính là từ định nghĩa đơn giản về chúng.

Một class nhất định phải được biểu thị bằng abstract nếu nó có nhiều hơn một abstract method. Một method được biểu thị là abstract nếu nó có method heading tuy nhiên phần thân là rỗng – có nghĩa là một abstract method sẽ không có implementation code bên trong dấu ngoặc như những method thường khác.

3.1 Khi nào thì sử dụng abstract method trong Java?

Trong Figure class ở phía trên, ta có một abstract method với tên getArea().

Chính vì class này chứa một abstract method cho nên bản thân Figure class phải được biểu thị bằng abstract. Figure base class có 2 class bắt nguồn từ nó là Circle và Rectangle. Cả 2 class này đều có định nghĩa là getArea method như bạn có thể nhìn trong ví dụ.

Tuy nhiên vấn đề chính đó là tại sao chúng ta phải biểu thị method getArea là abstract trong Figure class?

Xem nào, nhiệm vụ của getArea method là gì? Nhiệm vụ của nó là trả về area của một dạng (shape) nhất định.

Bản thân của Figure class không phải là một dạng nhất định giống như Circle hay Rectangle, chính vì vậy chúng ta không thể có một định nghĩa cụ thể nào cho getArea method trong Figure class. Điều đó đã lý giải tại sao chúng ta biểu thị getArea method là abstract trong Figure class.

Bất cứ một class nào bắt nguồn từ Figure class về cơ bản sẽ có 2 lựa chọn

cần đưa ra định nghĩa cụ thể cho getArea method

biểu thị bản thân là abstract

Class không phải là abstract được gọi là concrete class. Các bạn cũng nên biết rằng class không phải là abstract được gọi là concrete class, những thuật ngữ này sẽ giúp ích trong các cuộc phỏng vấn.

Sau khi chúng ta đã khám phá khái niệm về abstract method cũng như class, hãy đi vào khái niệm về interface và xem chúng khác gì với abstract class.

Một inteface khác với abstract class vì nó không phải là class. Nó đơn giản chỉ là một dạng thiết yếu có thể được thoả mãn bởi bất cứ class nào implement interface đó.

Bất cứ class nào implement một interface phải thoả mãn 2 điều kiện:

nó phải có cụm “implements Interface_Name” tại phần đầu khi định nghĩa class

nó phải implement toàn bộ method được liệt ra trong định nghĩa của interface.

Bây giờ nếu một class implement interface này thì nó sẽ giống như sau:

Sau khi đã hiểu được những điều cơ bản nhất của interface và abstract class, chúng ta bắt đầu đi vào vấn đề chính của câu hỏi và khám phá điểm khác biệt của nó. Có 3 điểm khác biệt chính:

Abstract class và inheritance

Abstract class sinh ra là để được inherit (kế thừa), và chính vì thế khi có một class inherit một class khác điều đó chứng tỏ có một mối quan hệ mật thiết giữa 2 class đó. Ví dụ, nếu chúng ta có một abstract base class tên là Canine thì bất cứ class muốn kế thừa nào cũng nên thuộc dòng Canine (như Dog hay Wolf). Lý do chúng ta sử dụng từ “nên” đó là vì điều đó phụ thuộc vào Java developer – người nên đảm bảo mối quan hệ được khăng khít.

Với interface, mối quan hệ giữa interface và class implement nó không cần quá mật thiết. Ví dụ, nếu chúng ta có một class tên là House, class này có thể implement một interface khác tên là AirConditioning. Việc có hay không có air conditioning cũng không phải là điều thiết yếu của một ngôi nhà, mối quan hệ đó không thể mật thiết như TownHouse class và House class được, hay như mối quan hệ của Apartment class bắt nguồn từ class House.

Bởi vì TownHouse là một dạng của House, chính vì thế mối quan hệ sẽ rất khăng khít, điều đó sẽ khiến thay vì interface, sử dụng kế thừa sẽ là hợp lý hơn nhiều.

Chúng ta có thể tổng hợp lại ý đầu tiên chính là “sẽ hợp lý hơn nếu sử dụng abstract class trong trường hợp có một mối quan hệ mật thiết giữa abstract class và class bắt nguồn từ nó”. Điều đó chính là vì abstract class có liên kết chặt chẽ với việc kế thừa, điều bao hàm một mối quan hệ khăng khít. Tuy nhiên với interface thì bạn không cần một mối quan hệ quá mật thiết giữa interface và class implement interface đó.

Interface là sự thay thế tốt cho việc đa kế thừa

Java không cho phép việc đa kế thừa – hãy tìm hiểu về các cuộc bàn thảo về Java Multiple Inheritance nếu bạn muốn tìm hiểu thêm. Trong Java, một class chỉ có thể bắt nguồn từ một class khác, kể cả nó có abstract hay không. Tuy nhiên, một class có thể implement nhiều interface – điều này có thể coi là sự thay thế cho đa kế thừa. Chính vì thế, điều khác biệt chính đó là một Java class chỉ có thể kế thừa một abstract class, tuy nhiên có thể implement nhiều interface.

Abstract class có thể có implementation code

Một abstract class có thể cung cấp nhiều method đi kèm định nghĩa – chính vì thế một abstract class có thể có method không abstract với những chi tiết implementation thực tế. Một abstract class cũng có thể có constructor và instance variable. Tuy nhiên, một interface không thể cung cấp bất cứ định nghĩa method nào – nó chỉ có thể cung cấp method rỗng mà thôi (điều này sẽ được thay đổi trong java 8). Bất cứ class nào implement interface phải chịu trách nhiệm cung cấp định nghĩa/implementation cho method.

3.3 Khi nào thì sử dụng abstract class và interface trong Java

Hãy sử dụng abstract class nếu bạn dự định sử dụng kế thừa và cung cấp base class phổ thông cho những class bắt nguồn từ nó.

Abstract class cũng rất hữu dụng nếu bạn muốn có thể biểu thị những phần tử không public. Trong một interface, tất cả các method phải là public.

Nếu bạn nghĩ rằng mình cần phải thêm method trong tương lai thì abstract class sẽ là phương án tốt hơn cho bạn. Điều này là vì nếu bạn thêm những method rỗng vào trong interface thì tất cả các class vốn dĩ đã implement interface này phải thay đổi hết sang implement những method mới đó nữa. (điều này được khác phục trong java 8).

Interface sẽ là lựa chọn tốt nếu bạn nghĩ rằng API sẽ không thay đổi trong tương lai gần.

Interface cũng rất tốt nếu bạn muốn có kiểu đa kế thừa trong hệ thống khi bạn có thể tạo nhiều interface và bắt class implement chúng.

All Rights Reserved

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 Nhau Giữa Interface Với Abstract Và Cách Sử Dụng Chúng Trong Java.

Tổng quan

Trong java, chúng ta có class abstract và một Interface, ai cũng biết một class có thể impements nhiều Interface và chỉ kế thừa được một class abstract. Nhưng bạn thực sự đã biết khi nào thì ta dùng Interface, khi nào dùng Abstract. Chưa kể bắt đầu từ Java 8 có sự thay đổi về Interface càng làm khó phân biệt giữa hai loại này.

Trong bài viết này chúng tôi sẽ đi so sánh một số tính chất của 2 loại này, sau đó là đưa ra ví dụ đơn giải để các bạn hình dung rõ nhất. Cuối cùng là hiểu khi nào thì dùng chúng.

Sự khác nhau giữa Interface và Abstract

Methods: Class abstract có các phương thức abstract và non-abstract. Trong khi Interface chỉ có phương thức abstract, từ Java 8, thì Interface có thêm 2 loại phương thức là default và static.

Variables: Class abstract có thể có các biến final, non-final, static và non-static. Trong khi Interface chỉ có các biến static và final.

Implementation: Class abstract có thể implement các Interface. Trong khi Interface thì không thể implement class abstract.

Inheritance: Class abstract có thể kế thừa được một class khác. Trong khi Interface có thể kế thừa được nhiều Interface khác.

Accessibility: các thành viên trong Interface kiếu mặc định là public. Trong khi class abstract thì lại có thể là private, protected,..

Abstract là gì?

Abstract(trừu tượng) nghĩa là một cái gì đó không hoàn toàn cụ thể, nó chỉ là một ý tưởng hoặc ý chính của một cái gì đó mà không có bản triển khai cụ thể. Vì vậy Class abstract chỉ là một cấu trúc hoặc hướng dẫn được tạo cho các class cụ thể khác.

Chúng ta có thể nói rằng một class abstract là linh hồn của một class cụ thể, và rõ ràng một cơ thể (class) không thể có hai linh hồn. Đây cũng là lý do Java không hỗ trợ nhiều kế thừa cho các class abstract.

Hãy nhìn vào class abstract sau: Xe.class

Chúng tôi tạo một class abstract Xecó thuộc tính là động cơ, và các phương thức khởi động/ dừng động cơ. Xe là một cái gì đó không cụ thể, nó có thể là ô tô, xe máy, … và rõ ràng không có Xe nào mà không tồn tại động cơ và cơ chế khởi động/dừng động cơ cả.

Interface là gì?

Interface (Giao diện) là một hình thức, giống như một hợp đồng, nó không thể tự làm bất cứ điều gì. Nhưng khi có một class ký kết hợp đồng (implement Interface) này, thì class đó phải tuân theo hợp đồng này.

Trong Interface, chúng tôi định nghĩa các hành vi của một class sẽ thực hiện. Một class có thể có một số cách hành vi khác nhau, cũng giống như nó có thể ký kết được với nhiều hợp đồng khác nhau. Đó cũng là lý do tại sao Java cho phép implement nhiều Interface.

Tiếp nối ví dụ trên, Xe có thể di chuyển, vì vậy chúng tôi tạo một Interface Hành động di chuyển và class Oto implement nó.

HanhDongDiChuyen.class

Đây là những hành vi của Oto, chứ không thuộc tính sẵn có của nó: Ôtô là xe hơi, ngay cả khi nó không thể di chuyển được!

Khi nào nên dùng?

Class abstract đại diện cho mối quan hệ “IS – A” (Ôtô là Xe)

Interface đại diện cho mối quan hệ “like – A” (Ô tô có thể chuyển động).

Tạo một class abstract khi bạn đang cung cấp các hướng dẫn cho một class cụ thể.

Tạo Interface khi chúng ta cung cấp các hành vi bổ sung cho class cụ thể và những hành vì này không bắt buộc đối với clas đó.

Kết luận

All Rights Reserved

Bạn đang đọc nội dung bài viết Phân Biệt Lớp Abstract Và Interface Trong Java trên website Cuocthitainang2010.com. Hy vọng một phần nào đó những thông tin mà chúng tôi đã cung cấp là rất hữu ích với bạn. Nếu nội dung bài viết hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!