Trong bài này, tôi sẽ giới thiệu về lớp trừu tượng (abstract class) và interface trong Java, đồng thời phân tích sự giống và khác nhau giữa chúng.

Đang xem: Interface trong java là gì

Bạn đang xem: Interface trong java là gì

Các tính chất của lập trình hướng đối tượng, các bạn có thể xem ở bài viết: 4 tính chất của lập trình hướng đối tượng trong Java.

Lớp trừu tượng (Abstract Class) trong Java

Đặc điểm của lớp trừu tượng (abstract class)

Một lớp được khai báo với từ khóa abstract là lớp trừu tượng (abstract class).

Lớp trừu tượng có thể có các phương thức abstract hoặc non-abtract.

Lớp trừu tượng 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.

Một lớp kế thừa từ lớp trừu tượng (subclass – lớp con) không cần phải implement non-abstract methods, nhưng những method nào có abstract thì bắt buộc phải override. Trừ khi subclass cũng là abstract.

Cú pháp:

abstract class { }

Phương thức trừu tượng trong Java

Một phương thức được khai báo là abstract và không có trình triển khai thì đó là phương thức trừu tượng (abstract method).Nếu bạn muốn một lớp chứa một phương thức cụ thể nhưng bạn muốn triển khai thực sự phương thức đó để được quyết định bởi các lớp con, thì bạn có thể khai báo phương thức đó trong lớp cha ở dạng abstract.Từ khóa abstract được sử dụng để khai báo một phương thức dạng abstract. Phương thức abstract sẽ không có định nghĩa, được theo sau bởi dấu chấm phẩy, không có dấu ngoặc nhọn theo sau.Cú pháp:

abstract void ();

Ví dụ về lớp trừu tượng và phương thức trừu tượng

Ví dụ: Viết chương trình vẽ một hình bất kỳ với màu đỏ, sao cho cách sử dụng là giống nhau, bất kể đó là hình gì. Hình đó có thể là hình chữ nhật (rectangle), hình tròn (circle), tam giác (triangle), đường (line), …

Với yêu cầu trên, tôi tạo một lớp trừu tượng Shape. Lớp này cung cấp một phương thức trừu tượng draw, phương thức này để đảm bảo rằng tất cả các hình đều có cùng cách sử dụng (draw). Ngoài ra, có phương thức không trừu tượng getColor để cung cấp màu sử dụng chung cho tất cả các hình. Tiếp theo, tôi tạo 2 lớp RectangleCircle kế thừa từ lớp Shape, 2 lớp này có những cách xử lý draw khác nhau. Cuối cùng, tôi tạo class ShapeApp, gọi phương thức draw để vẽ hình theo yêu cầu.

Shape.java

public abstract class Shape {private String color = “red”;public Shape() {}public abstract void draw();public String getColor() {return color;}}Rectangle.java

public class Rectangle extends Shape {Overridepublic void draw() {System.out.println(“Draw ” + super.getColor() + ” rectangle”);}}Circle.java

public class Circle extends Shape {Overridepublic void draw() {System.out.println(“Draw ” + super.getColor() + ” circle”);}}ShapeApp.java

public class ShapeApp {public static void main(String args) {Shape rect = new Rectangle();rect.draw();System.out.println(“—“);Shape circle = new Circle();circle.draw();}}Kết quả:

Draw red rectangle—Draw red circle

Một vài lưu ý

Lớp con bắt buộc phải cài đặt (implement) tất cả các phương thức trừu tượng của lớp cha

Bạn nhận được thông báo lỗi nếu lớp con không cài đặt (implement) tất cả các phương thức trừu tượng của lớp cha: The type Triangle must implement the inherited abstract method Shape.draw().

*

Interface trong Java

Đặc điểm của Interface

Các phương thức trong interface đều là các phương thức trừu tượng.Interface là một kỹ thuật để thu được tính trừu tượng hoàn toàn và đa kế thừa trong Java.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ó hàm khởi tạo (constructor).Một interface không phải là một lớp. Viết một interface giống như viết một lớp, nhưng chúng có 2 định nghĩa khác nhau. Một lớp mô tả các thuộc tính và hành vi của một đối tượng. Một interface chứa các hành vi mà một class triển khai.Trừ khi một lớp triển khai interface là lớp trừu tượng abstract, còn lại tất cả các phương thức của interface cần được định nghĩa trong class.

Java Compiler thêm từ khóa public abstract trước phương thức của interface và các từ khóa public static final trước các thành viên dữ liệu.

Một interface tương tự với một class bởi những điểm sau đây:

Một interface được viết trong một file với định dạng .java, với tên của interface giống tên của file.Bytecode của interface được lưu trong file có định dạng .class.Khai báo interface trong một package, những file bytecode tương ứng cũng có cấu trúc thư mục có cùng tên package.

Một interface khác với một class ở một số điểm sau đây:

Bạn không thể khởi tạo một interface.Một interface không chứa bất cứ hàm Contructor nào.Tất cả các phương thức của interface đều là abstract.Một interface không thể chứa một trường nào trừ các trường vừa static và final.Một interface không thể kế thừa từ lớp, nó được triển khai bởi một lớp.Một interface có thể kế thừa từ nhiều interface khác.

Xem thêm: Công An Viên Là Gì ? Phân Biệt Cav Với Các Lực Lượng Công An Khác

Ví dụ sử dụng Interface trong Java

Tương tự như yêu cầu ở ví dụ về sử dụng abstract class ở trên, nhưng tôi sẽ dụng Interface để áp dụng vào chương trình.

Shape.java

public interface Shape {String color = “red”;void draw();}Rectangle.java

public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(“Draw ” + color + ” rectangle”);}}Circle.java

public class Circle implements Shape {Overridepublic void draw() {System.out.println(“Draw ” + color + ” circle”);}}ShapeApp.java

public class ShapeApp {public static void main(String args) {Shape rect = new Rectangle();rect.draw();System.out.println(“—“);Shape circle = new Circle();circle.draw();}}Kết quả:

Draw red rectangle—Draw red circleKhi ghi đè các phương thức được định nghĩa trong interface, có một số qui tắc sau:

Khi triển khai interface, có vài quy tắc sau:

Một lớp có thể triển khai một hoặc nhiều interface tại một thời điểm.Một lớp chỉ có thể kế thừa một lớp khác, nhưng được triển khai nhiều interface.Một interface có thể kế thừa từ một interface khác, tương tự cách một lớp có thể kế thừa lớp khác.

Đa thừa kế trong Java bởi Interface

Nếu một lớp triển khai đa kế thừa, hoặc một Interface kế thừa từ nhiều Interface thì đó là đa kế thừa.

Trong Java, một lớp chỉ được thừa kế (extends) từ một lớp, có thể cài đặt (implements) nhiều interface. Tuy nhiên, một interface có thể thừa kế (extends) nhiều interface.

Một interface không thể cài đặt (implements) interface khác, do interface không phần cài đặt, chỉ chứa các khai báo.

Ví dụ một lớp cài đặt (implements) nhiều interface:

public interface Shape {void draw();}public interface Color {String getColor();}public class Rectangle implements Shape, Color {Overridepublic String getColor() {return “red”;}}Ví dụ interface kế thừa (extend) nhiều interface

public interface Shape {void draw();}public interface Color {String getColor();}public interface ShapeColor extends Shape, Color {}public class Circle implements ShapeColor {Overridepublic String getColor() {return “red”;}}Câu hỏi: Đa kế thừa không được hỗ trợ thông qua lớp trong Java nhưng là có thể bởi Interface, tại sao?

Như đã giới thiệu, kế thừa không được hỗ trợ thông qua lớp. Nhưng nó được hỗ trợ bởi Interface bởi vì không có tính lưỡng nghĩa khi trình triển khai được cung cấp bởi lớp Implementation.

Ví dụ đa thừa kế với Interface

public interface Printable { void print(); } public interface Showable { void print(); } public class InterfaceDemo implements Printable, Showable { public void print() { System.out.println(“Welcome to honamphoto.com”); } public static void main(String args) { InterfaceDemo obj = new InterfaceDemo(); obj.print(); } } Trong ví dụ trên, interface PrintableShowable có cùng các phương thức print() nhưng trình triển khai của nó được cung cấp bởi lớp InterfaceDemo, vì thế không có tính lưỡng nghĩa ở đây.

Ví dụ đa thừa kế với class

public class Printable { void print() { System.out.println(“Printable”); }} public class Showable { void print() { System.out.println(“Showable”); }} // Không thể thực hiện đa thừa kế với classpublic class InterfaceDemo extends Printable, Showable { public static void main(String args) { InterfaceDemo obj = new InterfaceDemo(); obj.print(); // Không thể xác định được gọi phương thức print() của class nào } } Trong ví dụ trên, lớp PrintableShowable có cùng các phương thức print() và InterfaceDemo kế thừa 2 class đó không override lại phương thức print() nên trình biên dịch không biết thực thi phương thức print() của lớp Printable hay là của lớp Showable. Để đảm bảo an toàn và giảm tính phức tạp của hệ thống nên Java không hỗ trợ đa thừa kế đối với class.

Marker (hay Tagging) Interface trong Java là gì?

Đó là một Interface mà không có thành viên nào. Ví dụ: Serializable, Cloneable, Remote, … Chúng được sử dụng để cung cấp một số thông tin thiết yếu tới JVM để mà JVM có thể thực hiện một số hoạt động hữu ích.

Ví dụ

public interface Serializable { } Có hai mục đích thiết kế chủ yếu của tagging interface là:

Tạo một cha chung: Như với EventListener interface, mà được kế thừa bởi hàng tá các interface khác trong Java API, bạn có thể sử dụng một tagging interface để tạo một cha chung cho một nhóm interface. Ví dụ, khi một interface kế thừa EventListener, thì JVM biết rằng interface cụ thể này đang được sử dụng trong một event.Thêm một kiểu dữ liệu tới một class: Đó là khái niệm tagging. Một class mà triển khai một tagging interface không cần định nghĩa bất kỳ phương thức nào, nhưng class trở thành một kiểu interface thông qua tính đa hình (polymorphism).

Interface lồng nhau trong Java

Một Interface có thể có Interface khác, đó là lồng Interface.

Xem thêm: Teemo Mùa 11: Bảng Ngọc Bổ Trợ Và Cách Chơi Teemo Mùa 8, Bảng Ngọc Bổ Trợ Và Cách Chơi Teemo Mùa 8

Ví dụ:

interface Printable {void print();interface MessagePrintable {void msg();}}

So sánh abstract class và interface trong Java

Nói về Abtract Class và Interface, đôi khi bạn sẽ gặp một số cách gọi: Khi một class extend một class/ abtract class thì có nghĩa là ta đang thể hiện mối quan hệ is-a (là), còn khi implement một interface, thì ta đang thể hiện mối quan hệ has-a (có, hay thực hiện).

Ví dụ:

// Programmer là Person, thực hiện việc Programming, Debuggingclass Programmer extends Person implements Programming, Debugging {}// Rectangle là Shape, có Width, Heightclass Rectangle extends Shape implements Width, Height {}Tài liệu tham khảo

Leave a Reply

Your email address will not be published. Required fields are marked *