Tại sao phải dùng interface thay vì astract

Ở bài trước, chúng ta đã tìm hiểu về TÍNH TRỪU TƯỢNG trong lập trình hướng đối tượng. Hôm nay, Kteam sẽ giới thiệu cho các bạn về interface để biết về đa kế thừa trong Java.

Nội dung

Để đọc hiểu bài này, tốt nhất các bạn nên có kiến thức cơ bản về các phần sau:

Bài này chúng ta sẽ tìm hiểu những vấn đề sau:

  • Interface là gì? Tại sao phải sử dụng?
  • Khai báo và sử dụng interface

Interface là gì? Tại sao phải sử dụng?

Interface là một kiểu dữ liệu tham chiếu trong Java. Nó là tập hợp các phương thức abstract (trừu tượng). Khi một lớp kế thừa interface, thì nó sẽ kế thừa những phương thức abstract của interface đó.

Một số đặc điểm của interface:

  • Không thể khởi tạo, nên không có phương thức khởi tạo.
  • Tất cả các phương thức trong interface luôn ở dạng public abstract mà không cần khai báo.
  • Các thuộc tính trong interface luôn ở dạng public static final mà không cần khai báo, yêu cầu phải có giá trị.

Mục đích của interface là để thay thế đa kế thừa lớp của những ngôn ngữ khác (ví dụ như C++, Python…). Ngoài ra, interface sẽ giúp đồng bộ và thống nhất trong việc phát triển hệ thống trao đổi thông tin.

Khai báo và sử dụng interface

Cú pháp:

interface {

        // Khai báo các thành phần bên trong interface

}

 Bây giờ ta sẽ tạo ra interface IStudy giành riêng cho class Student, ta vẫn tạo file .java như mọi khi và viết chương trình như sau:

interface IStudy { void study(); }

Ta cho class Student kế thừa nó như sau:

public class Student extends Person implements IStudy{

 Nếu dùng Eclipse, bạn sẽ thấy IDE yêu cầu override lại phương thức study() của IStudy ngay:

Tại sao phải dùng interface thay vì astract

Ta sẽ overriding, thêm đoạn chương trình trong lớp Student như sau:

@Override public void study() { // TODO Auto-generated method stub System.out.println(this.name+" is studing"); }

Một class có thể kế thừa nhiều interface, ta sẽ thử tạo thêm interface ISpeak:

interface ISpeak { void speak(); }

 Ta thêm interface ISpeak vào class Student bằng cách sau:

public class Student extends Person implements IStudy, ISpeak{

 Hoặc, ta thử thêm ISpeak ở lớp cha Person:

public abstract class Person implements ISpeak{

 Bởi vì class Person là lớp ảo, nên Person không cần override phương thức speak(). Ngoài ra, Student là lớp con Person, nên mặc dù Student không kế thừa ISpeak trực tiếp nhưng vẫn phải override phương thức speak(). Ta sẽ thấy Eclipse yêu cầu khai báo:

Tại sao phải dùng interface thay vì astract

Ta sẽ hoàn thiện lớp Student như sau:

public class Student extends Person implements IStudy{ public String universityName; public Student(String name, int age, float height, String universityName) { super(name, age, height); this.universityName = universityName; } public void getInfo() { super.getInfo(); System.out.println("University Name:"+this.universityName); } @Override public Object clone() { Student other = new Student(this.name, this.getAge(), this.height, this.universityName); return other; } @Override public void study() { // TODO Auto-generated method stub System.out.println(this.name+" is studing"); } @Override public void speak() { // TODO Auto-generated method stub System.out.println(this.name+" is speaking"); } }

Kết

Như vậy chúng ta đã tìm hiểu interface trong lập trình hướng đối tượng

Ở bài sau, Kteam sẽ giới thiệu đến bạn về  PHƯƠNG THỨC MAIN TRONG JAVA

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.

Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Trong một lần tình cờ vào VOZ forums, có một bạn hỏi về Interface trong Java là gì? Nó khác với Abstract Class chỗ nào? Tại sao phải dùng Interface, mặc dù nó chẳng rút gọn code đi tý nào, thậm chí còn dài hơn. Mặc dù có nhiều bạn trả lời cho chủ topic đó nhưng hầu hết là hiểu sai, hoặc chưa hiểu rõ bản chất của Interface trong Java.

Bạn đang xem: Tại sao phải dùng interface

Để các bạn có cái nhìn thấu đáo, hiểu rõ bản chất của Interface. Từ đó có thể ứng dụng Interface một cách chuẩn chỉ cho dự án của mình. Mình đã cho ra đời bài viết này.

Tại sao phải dùng interface thay vì astract


Nội dung chính của bài viết

Java Interface là gì? Có phải “bộ mặt” của Java?Đặc điểm chính của Java Interface

Java Interface là gì? Có phải “bộ mặt” của Java?

Để hiểu một cách chính xác thì phải đọc khái niệm Interface của chính chủ Oracle:

In its most common form, an interface is a group of related methods with empty bodies.Oracle

Đến Oracle cũng không thể định nghĩa Interface một cách khoa học kiểu: Interface là xyz, bla bla. Nhưng chúng ta có thể hiểu một cách nôm na và chính xác như sau: Trong thế giới thực, chúng ta có vật (đồ vật, con vật…) và các hành vi của nó. Interface được sinh là để định nghĩa các hành vi của một nhóm vật.

Mình lấy ví dụ như sau: Một con mèo (đây là con vật) thì có các hành vi như: chạy, bắt chuột, ngủ…

Ta sẽ định nghĩa một Interface Cat như sau:

interface CatBehaviors { // Cách con mèo chạy với tốc độ void run(int speed); // Cách con mèo bắt chuột void catchMouse(int mouse); // Định nghĩa cách con mèo ngủ. void sleep();}Sau này chúng ta định nghĩa một con mèo thì tất nhiên nó sẽ phải các hành vi của con mèo, dù nó là mèo tam thể hay mèo vàng…

class Cat implements CatBehaviors { private String màu_lông; //Cách con mèo chạy với tốc độ void run(int speed){ ... } //Cách con mèo bắt chuột void catchMouse(int mouse){ ... } // Định nghĩa cách con mèo ngủ. void sleep(){ ... }}Về học thuật thì Interface chính là khái niệm để hiện thực hóa triết lý đa hình trong lập trình hướng đối tượng. Cụ thể hơn thì mình sẽ giải thích ở phần sau của bài viết.

Interface Java cũng là một Abstract Class bao gồm các method được định nghĩa (nhưng nội dung của method thì không được viết cụ thể, người ta gọi là abstract method). Một Class sau này sẽ implements một Interface, đến lúc đó class mới viết cụ thể nội dung của các method được định nghĩa trong interface.

Trong Interface, ngoài abstract method, bạn hoàn toàn có thể thêm constants, static methods, nested interfaces (interface trong một interface) và default methods.

Điểm giống – khác nhau giữa Interface và Abstract class:

Một interface về cơ bản hoàn toàn giống với abstract class. Một interface cũng có các abstract method và các method được thiết kế để implement ở các class khác. Việc implement này hoàn toàn giống với việc extend và override method trong Abstract class.

Về điểm khác nhau, thì mình thấy có 2 điểm chính:

Về cách viết code: các method trong interface phải là empty method, tức là method không có nội dung, chỉ có tên hàm, tham số và kiểu dữ liệu trả về. Trong khi với abstract class thì bạn hoàn toàn có thể thêm abstract method hoặc method bình thường (là method có nội dung, logic bên trong body). Về mục đích sử dụng: Interface là một chức năng mà bạn có thể thêm và bất kì class nào. Từ chức năng ở đây không đồng nghĩa với method (hay còn gọi là hàm).Abstract class là một class cha cho tất cả các class có cùng bản chất. Bản chất ở đây được hiểu là kiểu, loại, nhiệm vụ của class.

Xem thêm: Glucosamine Sulfate Là Gì ? Lợi Ích Và Hướng Dẫn Cách Bổ Sung

Tại sao chúng ta cần Interface

Lý do chính là Java không hỗ trợ đa kế thừa. Do đó, bạn không thể kế thừa cùng một lúc nhiều class. Các class con không thể kế thừa các thuộc tính của nhiều class cha, vì nó dẫn đến bài toán Kim Cương (các bạn search Google để biết cái này nhé).

Để giải quyết vấn đề này, người ta mới cho ra đời Interface. Để hiểu rõ hơn, chúng ta sẽ cùng nhau xem ví dụ dưới đây.

Bạn muốn thiết kế một Sở thú, gồm rất nhiều các con vật. Về cơ bản thì các con vật đều có các đặc điểm chung như: Có tên, có tiếng kêu, có chân (2 chân, 4 chân, hoặc 0 có chân nào…). Từ những đặc điểm chung đó bạn tạo một abstract class là: abstract class Animal

Tại sao phải dùng interface thay vì astract

Tuy nhiên lại có một số loài lại biết bay, một số loài thì biết bơi. Và cái “dở” là loài biết bay lại không biết bơi. Do vậy, ta không thể để đặc điểm biết bay hay biết bơi trong class Animal được.

Đó là lý do chúng ta cần tạo 2 Interface khác nhau là Can_Fly và Can_Swim rồi xem class nào có thể implements từng cái thích hợp.

Tại sao phải dùng interface thay vì astract

Đặc điểm chính của Java Interface

Bạn đọc đến chắc cũng đã hiểu phần nào về Interface trong Java rồi đúng không? Khi nào thì cần phải sử dụng Interface, và nó khác với Class thường chỗ nào.

Giờ mình sẽ tổng kết lại những đặc điểm chính mà bạn cần phải nhớ về Interface:

Các method được khai báo trong Interface phải là method rỗng.Không thể tạo đối tượng từ Interface.Một Class có thể implement một hoặc nhiều Interface.

Mình viết một đoạn code mình họa cho đỡ nhàm chán nhé.

public interface extInterface { public void method1(); public void method2();}import java.util.Scanner;class Edureka implements extInterface{ public void method1(){ System.out.println("implementation of method1"); Scanner scanner = new Scanner(System.in); System.out.println("Enter number to find square root in Java : "); double square = scanner.nextDouble(); double squareRoot = Math.sqrt(square); System.out.printf("Square root of number: %f is : %f %n" , square, squareRoot); } public void method2(){ System.out.println("implementation of method2"); }public static void main(String arg<>){ extInterface obj = new Edureka(); obj.method1(); }}Chạy đoạn code sẽ thu được kết quả:

implementation of method1Enter number to find square root in Java :16Square root of number: 16.0 is : 4.0

Tổng kết

Như vậy là mình đã hoàn thành bài viết về Interface trong Java. Đọc đến đây, bạn đã “vỡ” ra được nhiều điều không? Nếu không thì… buồn ghê.

Các bạn nên nhớ, Interface chỉ là một công cụ, nó không phải là triết lý lập trình. Do vậy, khi ai đó nói tới lập trình hướng đối tượng, tới đa hình mà nói: Tính đa hình là interface. Thì không hẳn là đúng nhé. Nhớ này: Interface chỉ là một công cụ để thực hiện tính đa hình.