Xu Hướng 6/2023 # Sự Khác Nhau Giữa Abstract Class Với Interface Trong Java. # Top 9 View | Channuoithuy.edu.vn

Xu Hướng 6/2023 # Sự Khác Nhau Giữa Abstract Class Với Interface Trong Java. # Top 9 View

Bạn đang xem bài viết Sự Khác Nhau Giữa Abstract Class Với 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.

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

Abstract Class Và Interface Trong Java

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.

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

public abstract class ClassA { public abstract void doSomething(); protected abstract String doNothing(); 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 abstract.

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

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

package org.o7planning.tutorial.abs; public abstract class AbstractJob { public AbstractJob() { } public abstract String getJobName(); public abstract void doJob(); } package org.o7planning.tutorial.abs; public class JavaCoding extends AbstractJob { public JavaCoding() { } @Override public void doJob() { System.out.println("Coding Java..."); } @Override public String getJobName() { return "Coding Java"; } } package org.o7planning.tutorial.abs; public abstract class ManualJob extends AbstractJob { public ManualJob() { } @Override public String getJobName() { return "Manual Job"; } } package org.o7planning.tutorial.abs; public class BuildHouse extends ManualJob { public BuildHouse() { } @Override public void doJob() { System.out.println("Build a House"); } } package org.o7planning.tutorial.abs; public class JobDemo { public static void main(String[] args) { AbstractJob job1 = new JavaCoding(); job1.doJob(); String jobName = job1.getJobName(); System.out.println("Job Name 1= " + jobName); AbstractJob job2 = new BuildHouse(); job2.doJob(); String jobName2 = job2.getJobName(); System.out.println("Job Name 2= " + jobName2); } }

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

public class B extends A { } public class B { } public class B extends Object { }

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

public class Cat extends Animal implements CanEat, CanDrink { } Các đặc điểm của interface

Interface luôn luôn có modifier là: public interface, cho dù bạn có khai báo rõ hay không.

Nếu có các trường (field) thì chúng đều là: public static final, cho dù bạn có khai báo rõ hay không.

Các method của nó đều là method trừu tượng, nghĩa là không có thân hàm, và đều có modifier là: public abstract, cho dù bạn có khai báo hay không.

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

NoAccessModifierInterface.java

package org.o7planning.tutorial.itf; interface NoAccessModifierInterface { } package org.o7planning.tutorial.itf; public interface CanMove { public abstract void run(); void back(); public int getVelocity(); } package org.o7planning.tutorial.itf; public interface CanDrink { public static final String PEPSI = "PEPSI"; final String NUMBER_ONE = "NUMBER ONE"; String SEVENUP = "SEVEN UP"; public void drink(); } package org.o7planning.tutorial.itf; public interface CanEat { public void eat(); } package org.o7planning.tutorial.cls; import org.o7planning.tutorial.itf.CanMove; public abstract class Animal implements CanMove { @Override public void run() { System.out.println("Animal run..."); } } package org.o7planning.tutorial.cls; import org.o7planning.tutorial.itf.CanDrink; import org.o7planning.tutorial.itf.CanEat; public class Cat extends Animal implements CanEat, CanDrink { private String name; public Cat(String name) { this.name = name; } public String getName() { return this.name; } @Override public void back() { System.out.println(name + " cat back ..."); } @Override public int getVelocity() { return 110; } @Override public void eat() { System.out.println(name + " cat eat ..."); } @Override public void drink() { System.out.println(name + " cat drink ..."); } } package org.o7planning.tutorial.cls; import org.o7planning.tutorial.itf.CanDrink; import org.o7planning.tutorial.itf.CanEat; public class Mouse extends Animal implements CanEat, CanDrink { @Override public void back() { System.out.println("Mouse back ..."); } @Override public int getVelocity() { return 85; } @Override public void drink() { System.out.println("Mouse drink ..."); } @Override public void eat() { System.out.println("Mouse eat ..."); } } package org.o7planning.tutorial.cls; import org.o7planning.tutorial.itf.CanEat; public class AnimalDemo { public static void main(String[] args) { System.out.println("Drink " + Cat.SEVENUP); CanEat canEat1 = new Cat("Tom"); CanEat canEat2 = new Mouse(); canEat1.eat(); canEat2.eat(); boolean isCat = canEat1 instanceof Cat; System.out.println("catEat1 is Cat? " + isCat); if (canEat2 instanceof Mouse) { Mouse mouse = (Mouse) canEat2; mouse.drink(); } } }

Phân Biệt Sự Khác Nhau Giữa Interface Và Abstract Class Trong Php

Interface Là Gì

Interface định nghĩa tập hợp các method mà những class sử dụng interface sẽ cần phải triển khai (implement) các method này.

interface I_Test { public function foo(); }

Với interface I_Test được định nghĩa như trên thì bắt buộc tất cả các class sử dụng interface này phải có method foo().

Trong PHP để sử dụng một interface bạn sử dụng từ khoá implements:

interface I_Test { public function foo(); } class A implements I_Test { }

Nếu bạn lưu đoạn code trên vào một tập tin interface.php và chạy thì PHP sẽ báo lỗi như sau:

Fatal error: Class A contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (I_Test::foo) in...

Điều này là bởi vì class A sử dụng interface I_Test nên bắt buộc cần phải chứa bên trong nó method foo().

Bây giờ sửa lại class A lại giống đoạn code sau:

class A extends I_Test { public function foo(); }

Và chạy lại đoạn code thì bạn sẽ thấy PHP báo một lỗi khác:

Fatal error: Non-abstract method A::foo() must contain body in...

Điều này là bởi vì mặc dù class A đã có method foo nhưng method này lại không có nội dung. Nói cách khác class A mới chỉ khai báo chứ chưa thực sự việc triển khai method foo().

Bây giờ tiếp tục sửa lại class A lại giống đoạn code sau:

class A implements I_Test { public function foo {} }

Lúc này khi chạy lại đoạn code được cập nhật bạn sẽ thấy PHP không còn báo lỗi nữa. Điều này là bởi vì mặc dù method foo() của class A đã có nội dung mặc dù nội dung của method là rỗng (khác với việc không tồn tại nội dung).

Một lưu ý quan trọng với interface nữa đó là các class khác nhau triển khai cùng một interface sẽ có thể có các cách triển khai các method của interface theo các cách khác nhau. Ví dụ sau hai class A và B triển khai method foo của interface I_Test theo các cách khác nhau:

Kết quả hiển thị:

Hello World Foo

Chúng ta không thể tạo một instance object từ một interface. Đoạn code sau se không hợp lệ:

$iTest = new I_Test(); Abstract Class Là Gì

Abstract class định nghĩa tập hợp các method mà các class sử dụng (mở rộng) abstract class này cần phải triển khai (giống với interface), tuy nhiên khác với interface abstract class còn cung cấp thêm các method được triển khai cụ thể mà các class sử dụng nó có thể sử dụng mà không cần phải triển khai.

Ví dụ một abstract class như sau:

abstract class Abstract_Test { abstract function sayHello(); }

Với cách định nghĩa class sử dụng từ khoá abstract như trên thì Abstract_Test là một abstract class. Trong đó method sayHello() là một method mà class nào sử dụng class Abstract_Test sẽ cần phải triển khai:

<?php abstract class Abstract_Test { abstract function sayHello(); } class A extends Abstract_Test { }

Khi chạy đoạn code trên PHP sẽ báo lỗi:

Fatal error: Class A contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Abstract_Test::sayHello) in ...

Điều này là bởi vì class A mở rộng Abstract_Test nhưng lại không khai báo method sayHello().

Bây giờ cập nhật lại code của class A như sau:

class A extends Abstract_Test { function sayHello(); }

Thì khi chạy đoạn code mới trên PHP vẫn báo lỗi:

Fatal error: Non-abstract method A::sayHello() must contain body in ...

Điều này là bởi vì giống như phần trước chúng ta đã tìm hiểu về interface thì method sayHello() mặc dù được khai báo nhưng chưa được triển khai. Sửa lại class A như sau và khi chạy lại code bạn sẽ không gặp phải lỗi:

class A extends Abstract_Test { function sayHello() {} }

Một class abstract ngoài việc có thể chứa các method abstract thì còn có thể chứa các method non-abstract khác:

<?php abstract class Abstract_Test { abstract function sayHello(); public function foo() { echo "Foon"; } }

Lúc này các class con mở rộng class Abstract_Test sẽ có thể sử dụng method foo() mà không cần định nghĩa nó:

Ngoài ra class A cũng có thể viết đè method foo() trong Abstract_Test nếu muốn:

Ngoài ra, chúng ta không thể tạo một instance từ một Abstract class. Đoạn code sau sẽ không hợp lệ:

$aTest = new Abstract_Test();

Cuối cùng trước khi kết thúc bài viết bạn cần lưu ý rằng một class khi được định nghĩa với ít nhất một abstract method (method với từ khoá abstract ở phía trước) sẽ cần phải được định nghĩa là một abstract class. Ví dụ class được định nghĩa như sau sẽ không hợp lệ:

<?php class Abstract_Test { abstract function sayHello(); }

PHP sẽ báo lỗi:

Fatal error: Class Abstract_Test contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Abstract_Test::sayHello) in ...

Lỗi trên là do sayHello() đã được định nghĩa là abstract method nhưng class Abstract_Test lại không được định nghĩa là abstract class.

Khác Nhau Giữa Abstract Class Và Interface Khi Nào Dùng Chúng

Nhắc đến Interface và abstract class hãy nhớ 2 từ này khá clear rồi, Khi sử dụng Interface là bạn Implement còn sử dụng abstract class là bạn extend

Interface:

Không phải là class.

Chỉ chứa những method/properties trống không có thực thi.

Nó giống như một khuôn mẫu, một khung để để các lớp implement và follow.

Các lớp có thể implements nhiều interface.

Là một contract, các class implement phải triển khai các method theo như interface đã định nghĩa.

Abstract class:

Khá giống Interface nhưng nó có thể làm nhiều việc hơn.

Có 2 loại method là abstract method và method thường:

abstract method là method trống không có thực thi.

method thường là method có thực thi.

Các lớp chỉ có thể kế thừa một Abstract class

Hướng đến tính năng và những tính năng có thực thi được sử dụng làm hàm chung cho các class extend.

Tạo 2 interface IAnimal,Interface2 và 2 class Pig,Bird kế thừa 2 interface

Output:

Kết quả thực thi của class Pig, Bird sau khi implement các method của interface.

Ở demo trên mình tạo ra 2 interface IAnimal và Interface2 tiếp theo là 2 class Pig,Bird implement 2 interface.

Rồi đầu tiên bạn thấy điều gì trong interface? tất cả các method đều trống, không xử lý gì hết.

Các class Pig, Bird bắt buộc phải implement tất cả các method trong interface

Có thể Implement nhiều interface

Abstract class:

Abstract class Animal có 2 method là abstract method(Speak) và method thường(Eat), class Dog và Cat kế thừa lại abstract method

Triển khai code:

Output:

Như demo trên mình tạo abstract class Animal gồm 2 method, một abstract method và một method thường có thực thi. Có thể thấy là class Dog, Cat chỉ có thể extend một abstract class, và chỉ phải implement những abstract method còn những method thường không implement vẫn có thể sử dụng, ở trên mình viết method Eat() với từ khóa virtual nên class Dog, Cat có thể override lại.

Sau 2 demo trên các bạn rút ra được ưu điểm, nhược điểm, hay khi nào dùng interface hoặc abstract class không @@. Mình thấy thế này :

Ưu điểm:

Interface

Có thể kế thừa nhiều interface(tính đa hình).

Xây dựng được bộ khung mẫu mà các lớp phải follow theo.

Giúp quản lý tốt, nắm bắt được các chức năng phải có cho một đối tượng nào đó.

Abstract class

Có thể linh động các method. giống như một class thông thường.

Các class extend có thể override hoặc không override các method thường.

Nhược điểm:

Interface:

Mỗi khi định nghĩa thêm tính năng, các class impelement nó đồng lọat phải thêm tính năng đó, khả năng cao sẽ không có xử lý gì.

Abstract class

Không thể extend nhiều abstract class.

Khi nào sử dụng chúng:

Interface : Khi bạn muốn tạo dựng một bộ khung chuẩn gồm các chức năng mà những module hay project cần phải có. Giống như sau khi nhận requirement của khách hàng về team ngồi với nhau và phân tích các đầu mục các tính năng của từng module, sau đó triển khai vào code viết các interface như đã phân tích,để các bạn dev có thể nhìn vào đó để thực hiện đủ các tính năng (khi đã implement rồi thì không sót một tính năng nào ^^).

Abstract class: Giống như demo trên bạn có thể hiểu khi định nghĩa một đối tượng có những chức năng A,B,C trong đó tính năng A,B chắc chắn sẽ thực thi theo cách nào đó, còn tính năng C phải tùy thuộc vào đối tượng cụ thể là gì, như đối tượng Dog, Cat tuy chúng đều có thể phát ra âm thanh nhưng âm thanh là khác nhau. Vì vậy method Speak() là abstract method để chỉ ra rằng tính năng này còn dang dở chưa rõ thực thi, các lớp extend phải hoàn thành nốt tính năng này, còn những tính năng đã hoàn thành vẫn sử dụng như bình thường đây là những tính năng chung.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interfacehttps://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstractt

All Rights Reserved

Cập nhật thông tin chi tiết về Sự Khác Nhau Giữa Abstract Class Với 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!