Xu Hướng 3/2023 # Phân Biệt Lớp Abstract Và Interface Trong Java # Top 11 View | Channuoithuy.edu.vn

Xu Hướng 3/2023 # Phân Biệt Lớp Abstract Và Interface Trong Java # Top 11 View

Bạn đang xem bài viết Phân Biệt Lớp Abstract Và Interface Trong Java được cập nhật mới nhất trên website Channuoithuy.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung 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.

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

Sự Khác Nhau Giữa Abstract Class Và Interface Trong Java

Ở những bài trước, chúng ta đã biết đến tính trừu tượng, và đi song song đó là abstract class và interface để triển khai tính trừu tượng trong java.

Chúng ta cùng xem thử nó sẽ khác nhau ở điểm nào qua bảng liệt kê sau

1

Abstract class chỉ có thể thừa kế một class hoặc một abstract class khác.

Interface có thể thừa kế một hoặc nhiều interface khác.

2

Abstract class có thể chứa abstract method và method thông thường(method có thân hàm).

Interface chỉ có abstract method.

3

Abstract class có thể chứa protected hoặc public abstract method.

Interface chỉ có public abstract method.

4

Abstract class có thể chứa static, final hoặc static final biến.

Interface chỉ có public static final biến.

Abstract class chỉ có thể thừa kế một class hoặc một abstract class khác

public class Example1{ public void display1(){ System.out.println("method ex1"); } } public abstract class Example2 extends Example1{ abstract void display2(); } public class Example3 extends Example2{ public void display3(){ System.out.println("method ex3"); } } public class Main{ public static void main(String args[]){ Example3 obj=new Example3(); obj.display3(); } }

Output: method ex3

Interface có thể thừa kế một hoặc nhiều interface khác

public interface Example1{ public void display1(); } public interface Example2 { public void display2(); } public interface Example3 extends Example1,Example2{} public class Example4 implements Example3{ public void display1(){ System.out.println("method ex1"); } public void display2(){ System.out.println("method ex2"); } } public class Main{ public static void main(String args[]){ Example4 obj=new Example4(); obj.display1(); obj.display2(); } }

Output:

method ex1

method ex2

Abstract class có thể chứa abstract method và method thông thường(method có thân hàm)

public abstract class Example1 { abstract void display1(); public void display2(){ System.out.println("method" ex2); } } public class Example2 extends Example1{ public void display1(){ System.out.println("method ex1"); } } public class Main { public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); } }

Output:

method ex1

method ex2

Interface chỉ có abstract method

public interface Example1{ public abstract void display(); } public class Example2 implements Example1{ public void display(){ System.out.println("method dispaly="); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display(); } }

Output: display

Abstract class có thể chứa protected hoặc public abstract method

public abstract class Example1{ protected abstract void display1(); public abstract void display2(); public abstract void display3(); } class Example2 extends Example1{ public void display1(){ System.out.println("method ex1"); } public void display2(){ System.out.println("method ex2"); } public void display3(){ System.out.println("method ex3"); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); obj.display3(); } }

Output:

method ex1

method ex2

method ex3

Interface chỉ có public abstract method

public interface Example1{ void display1(); } public class Example2 implements Example1{ public void display1(){ System.out.println("method ex1"); } public void display2(){ System.out.println("method ex2"); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); } }

Output:

method ex1

method ex2

Abstract class có thể chứa static, final hoặc static final biến

public abstract class Example1{ private int num_1 = 1; protected final int num_2 = 2; public static final int num_ 3 = 3; public void display1(){ System.out.println("Num1="+num_1); } } public Example2 extends Example1{ public void display2(){ System.out.println("Num2="+num_2); System.out.println("Num3="+num_3); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); obj.display2(); } }

Output:

1

2

3

Interface chỉ có public static final biến

public interface Example1{ int num_1=10; } public class Example2 implements Example1{ public void display1(){ System.out.println("Num1="+num_1); } } public class Main{ public static void main(String args[]){ Example2 obj=new Example2(); obj.display1(); } }

Output: 10

Note:

Interface thường được dùng để mô tả một tập các chức năng. Một class thừa kế một interface A, ta nói rằng class đó có thể thực hiện các năng của interface A khai báo, mà chưa cần xem code.

Ví dụ: Chúng ta có Mail là một interface và MailImpl implements Mail

public class MailImpl implements Mail

Chúng ta sẽ hiểu rằng class MailImpl sẽ có thể thực hiện được các chứng năng mà Mail khai báo.

Abstract class thường được dùng trong mối quan hệ thừa kế, vì tính linh hoạt của nó có thể chứa abstract method và method thông thường. Dựa vào đó mà chúng ta có thể định nghĩa các khuôn mẫu hay triển khai những thuộc tính, method mà các class con có thể dùng chung.

Abstract Class Và Interface Trong C#

Trong tài liệu hướng dẫn này tôi sẽ hướng dẫn về Interface và class trừu tượng (Abstract Class). Đồng thời phân tích sự giống và khác nhau giữa chúng.

Trước hết bạn cần tạo một project có tên AbstractClassInterface để làm việc với các ví dụ.

Đặt nó là project mặc định.

Abstract class (Class trừu tượng). Hãy xem ví dụ về một class như thế:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractClassInterface { public abstract class ClassA { public abstract void DoSomething(); protected abstract String DoNothing(); protected abstract void Todo(); } public abstract class ClassB { } }

Đặc điểm của một class trừu tượng là:

Nó được khai báo với từ khóa abstract.

Nó có thể khai báo 0, 1 hoặc nhiều method trừu tượng bên trong.

Bạn không thể khởi tạo 1 đối tượng trực tiếp từ một class trừu tượng.

Chúng ta biết rằng một class chỉ có thể mở rộng từ một class khác.

public class B : A { } public class B { } public class B : Object { }

Nhưng một class có thể mở rộng từ nhiều Interface

public class Cat : Animal, CanEat, CanDrink { }

Các đặc điểm của interface trong CSharp.

Interface có modifier là public hoặc internal, nếu không ghi rõ mặc định là internal.

Interface không thể định nghĩa các trường (Field).

Các method của nó đều là method trìu tượng (abstract) và công khai (public), và không có thân hàm. Nhưng khi khai báo phương thức bạn lại không được phép ghi public hoặc abstract.

Interface không có cấu tử (Constructor).

Một interface trong CSharp có thể khai báo modifier là public hoặc internal, nếu không khai báo gì mặc định được hiểu là internal. Interface có modifier là public có thể được sử dụng ở mọi nơi, đối với interface có modifier là internal chỉ được sử dụng trong nội bộ Assembly.

Một Assembly là chính là sản phẩm đã biên dịch (compile) của mã của bạn, thường là một DLL, nhưng EXE cũng có thể coi là một assembly. Nó là đơn vị nhỏ nhất của việc triển khai cho bất kỳ dự án .NET nào.

Assembly một cách cụ thể chứa mã .NET theo MSIL ( Microsoft Intermediate language – Một ngôn ngữ trung gian) sẽ được biên dịch thành mã máy (Native code) (“JITted” – biên dịch bởi các trình biên dịch Just-In-Time) trong lần đầu tiên nó được thực thi trên máy tính,. Đó là mã đã được biên dịch cũng sẽ được lưu trữ trong Assembly và tái sử dụng cho các lần gọi tiếp theo.

Các phương thức trong Interface đều là công khai (public) và trừu tượng (abstract). Nó không có thân, nhưng bạn không được phép viết public hoặc abstract khi định nghĩa phương thức.

Khi một class thi hành một Interface, bạn phải thực hiện hoặc khai báo lại toàn bộ các phương thức có trong Interface đó.

Nếu bạn triển khai một phương thức nào đó của interface, bạn phải viết nội dung cho phương thức, khai báo phương thức là public.

Nếu bạn không triển khai một phương thức nào đó của interface, bạn phải khai báo lại nó trong class với từ khóa ‘public abstract’ và không được viết nội dung của phương thức.

Hãy xem ví dụ, class Animal thi hành interfaceCanMove.

Class Cat thừa kế từ class Animal đồng thời thực hiện 2 interfaceCanDrink,CanEat.

Đây là các khóa học trực tuyến bên ngoài website o7planning mà chúng tôi giới thiệu, nó có thể bao gồm các khóa học miễn phí hoặc giảm giá.

Sự Khác Biệt Giữa Lớp Trừu Tượng Abstract Và Giao Diện Interface

Đối với lập trình C# hay lập trình hướng đối tượng nói chung, vấn đề kế thừa sẽ đem lại nhiều phiền toái nếu bạn chưa nắm rõ về vấn đề này. Vậy thì sự khác biệt giữa lớp abstract và interface ở chỗ nào?

Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và nó sẽ được overriden lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì lớp đó cũng được định nghĩa abstract.

Đối với giao diện thì khác hoàn toàn với lớp trừu tượng, nó định nghĩa một cách cứng nhắc các phương thức và thuộc tính trong chúng nghĩa là không cho phép ta thực thi bất kỳ một đoạn mã nào. Và tất cả các thành viên trong nó đều được định nghĩa công khai (public). Một cách tổng quan về giao diện: Giao diện là ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho các thành phần client biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong giao diện.

Một số lưu ý khi sử dụng abstract hay interface

Một class chỉ có thể kế thừa từ một abstract class, nhưng có thể kế thừa nhiều interface.Trong Interface chỉ có thể khai báo các fields, methods, mà không được hiện thực nó. Còn đối với abstract thì dùng các biến, hiện thực cách methods.Các fields, methods trong interace đều là public và bắt buộc các class kế thừa phải cài đặt nó (abstract). Trong abstract class thì có các fields, methods có thể là private, internal, public, protected và có thể là abstract hoặc non-abstract.Interface dùng để gom các hành động cần được hiện thực , các khả năng của một đối tượng, còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái.Abstract class có tốc độ thực thi nhanh hơn interface.Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.

Ví dụ về interface, các thành viên của interface phải được thực thi trong các lớp mà kế thừa từ nó

public interface IPlayer { string Name { get; set; } Player Actor { get; set; } Bitmap Image { get; set; } }

{ protected string m_str_department; protected double m_db_salary; protected int m_i_dateHired;

public string Department { get { return m_str_department; } set { m_str_department = value; } }

public double Salary { get { return m_db_salary; } set { m_db_salary = value; } }

public int DateHired { get { return m_i_dateHired; } set { m_i_dateHired = value; } }

public override string ToString() { return “Employee: ” + m_str_name + “nEmail: ” + m_str_email; }

public abstract double CalculateBonus(); public abstract int CalculateVacation(); }

class Faculty : Employee { string m_str_rank; double m_db_hours;

public override double CalculateBonus() { return 1000 + 0.05 * m_db_salary; }

public override int CalculateVacation() { { if (m_str_rank == “Senior Lecture”) return 6; return 5; } if (m_str_rank == “Senior Lecture”) return 5; return 4; } }

Nguồn bài viết: Dngaz.com

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