Xem Nhiều 2/2023 #️ Phân Biệt Lớp Abstract Và Interface Trong Java # Top 10 Trend | Sansangdethanhcong.com

Xem Nhiều 2/2023 # Phân Biệt Lớp Abstract Và Interface Trong Java # Top 10 Trend

Cập nhật thông tin chi tiết về Phân Biệt Lớp Abstract Và Interface Trong Java mới nhất trên website Sansangdethanhcong.com. 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.

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

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(); } } }

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

Đây là một câu hỏi khá thú vị với vị trí junior java developer mà bất kì nhà tuyển dụng- NTD nào cũng đưa ra trong buổi phỏng vấn. Bài viết này, tôi sẽ giải thích chi tiết về sự khác nhau giữa hai khái niệm này.

Sự khác nhau giữa Abstract Class và Interface trong Java?

Abstract class và interface là một trong những phần core của ngôn ngữ lập trình Java và việc lựa chọn giữa asbtract class và interface trong thiết kế hệ thống là quyết đinh của một người – một team thiết kế hệ thống.

Và sự khác biệt giữa abstract class và interface được liệt kê như sau:

Abstract class có thể có nhiều method đã được implementation, trong khi interface chỉ define ra những abstract method (không thực hiện implementation).

Abstract class có thể có những contractor, trong khi interface không có bất kỳ một contractor nào.

Abstract class có tất cả tính năng của một java class bình thường, ngoại trừ việc instantiate nó. Interface chỉ được phép khai báo method và public static final constants.

Method của abstract class có thể sử dụng những access modifiers như private, protected, default, public, static nhưng method của interface chỉ sử dụng public và asbtract.

Một subclass chỉ có thể extend duy nhất một abstract class nhưng một class có thể implement nhiều interface.

Những abstract class có thể extend abstract class khác và implement nhiều interface, nhưng một interface chỉ có thể extend nhiều interface.

Có thể thực hiện run một abstract class nếu nó có một main() method, ngược với interface thì không.

Interfaces được sử dụng để define contract cho những class implement, abstract class cũng thực hiện define contract nhưng nó cung cấp một cách thức implementations có săn để subclass sử dụng.

Java không hỗ trợ “multiple class level inheritance”, do đó, mọi class chỉ có thể có một super class. Nhưng một class lại có thể implement nhiều interface. Do vậy, trong hầu hết các trường hợp, interface là một sự lựa chọn đúng đắn cho việc cung cấp base contract cho class hierarchy.

Nếu có nhiều method trong contract, thì bạn nên sử dụng abstract class vì nó cung cấp sẵn implementation cho một vài common method được áp dụng cho tất cả các subclasses.

Nếu contract của bạn thay đổi liên tục thì sử dụng interface có thể gặp những vấn đề bởi vì nó không thể thêm những method trong interface mà không thay đổi ở phía class thực hiện implement nó. Với abstract thì bạn không cần lo lắng điều này, do đó trong tình huống này thì sử dụng abstract là một giải pháp hiệu quả.

Cách sử dụng hiệu quả nhất?

Trong thực tế, việc sử dụng cả abstract class và interface là một phương pháp tiếp cận hiệu quả cho việc thiết kế hệ thống. Ví dụ như trong JDK, List là một interface có rất nhiều method, nhưng vẫn có song song một abstract class đó là AbstractList, nó cung cấp những skeletal implementation cho tất cả method của List interface, do đó, mọi subclass có thể extend class này và chỉ implement những method cần thiết.

Chúng ta nên luôn luôn bắt đầu bằng một interface như một base và define những method mà mọi subclasses nên thực hiện và sau đó nếu có một số method mà chỉ subclass nhất định phải implement, chúng ta có thể extend base interfacec này với các method mới đó. Các subclasses sẽ có tùy chọn để lựa chọn giữa base interface hoặc child interface để thực hiện những yêu cầu của nó. Nếu số lượng method phát triển nên nhiều, ý tưởng mới là sử dụng một abstract class để cung cấp ra bộ skeletal để imlement các child interface và cung cấp sự linh hoạt cho các subclass lựa chọn giữa abstract class hoặc interface.

Từ JDK 8 trở đi, bạn có thể có nhiều implement method trong nhiều interface. Tức là bạn có thể tạo ra mặc định như những static method trong những interface và cung cấp implementation cho chúng. Điều này sẽ thu hẹp khoảng cách giữa interface và abstract class, và bây giờ, interface là các thực hiện tốt nhất. Để biết thêm chi tiết về điểm thay đổi này trên JDK 8, bạn vui lòng đọc tài liệu JDK 8

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.

Bạn đang xem bài viết Phân Biệt Lớp Abstract Và Interface Trong Java trên website Sansangdethanhcong.com. 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. Chúc bạn một ngày tốt lành!