Công lý

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

[Globalizethis]

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.

khách tham quan đang xem: Abstract và interface trong java

những tính chất của lập trình hướng mục tiêu, những khách tham quan với thể xem ở bài viết: 4 tính chất của lập trình hướng mục tiêu 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 với thể với những phương thức abstract hoặc non-abtract.

Lớp trừu tượng với thể khai báo 0, một hoặc nhiều method trừu tượng bên trong.

ko thể khởi tạo một mục tiêu 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) ko cần phải implement non-abstract methods, nhưng những method nào với abstract thì phải phải override. Trừ lúc 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à ko với trình triển khai thì đó là phương thức trừu tượng (abstract method).Nếu khách tham quan muốn một lớp chứa một phương thức cụ thể nhưng khách tham quan muốn triển khai thực sự phương thức đó để được quyết định bởi những lớp con, thì khách tham quan với 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ẽ ko với định nghĩa, được theo sau bởi dấu chấm phẩy, ko với 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 đó với 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ả những hình đều với cùng cách sử dụng (draw). Ngoài ra, với phương thức ko trừu tượng getColor để cung cấp màu sử dụng chung cho tất cả những 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 với 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 phải phải cài đặt (implement) tất cả những phương thức trừu tượng của lớp cha

khách tham quan nhận được thông báo lỗi nếu lớp con ko cài đặt (implement) tất cả những 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

những phương thức trong interface đều là những 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 với modifier là: public interface, cho dù khách tham quan với khai báo rõ hay ko.Nếu với những trường (field) thì chúng đều là: public static final, cho dù khách tham quan với khai báo rõ hay ko.những method của nó đều là method trừu tượng, nghĩa là ko với thân hàm, và đều với modifier là: public abstract, cho dù khách tham quan với khai báo hay ko.Interface ko với hàm khởi tạo (constructor).Một interface ko phải là một lớp. Viết một interface tương đương viết một lớp, nhưng chúng với 2 định nghĩa khác nhau. Một lớp mô tả những thuộc tính và hành vi của một mục tiêu. Một interface chứa những hành vi mà một class triển khai.Trừ lúc một lớp triển khai interface là lớp trừu tượng abstract, còn lại tất cả những 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à những từ khóa public static final trước những 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 với định dạng .class.Khai báo interface trong một package, những file bytecode tương ứng cũng với cấu trúc thư mục với cùng tên package.

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

khách tham quan ko thể khởi tạo một interface.Một interface ko chứa bất cứ hàm Contructor nào.Tất cả những phương thức của interface đều là abstract.Một interface ko thể chứa một trường nào trừ những trường vừa static và final.Một interface ko thể kế thừa từ lớp, nó được triển khai bởi một lớp.Một interface với thể kế thừa từ nhiều interface 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 đè những phương thức được định nghĩa trong interface, với một số qui tắc sau:

những checked exception ko nên được khai báo trong phương thức implements, thay vào đó nó nên được khai báo trong phương thức interface hoặc những lớp phụ được khai báo bởi phương thức interface.Signature (ký số) của phương thức interface và kiểu trả về nên được duy trì lúc ghi đè phương thức (overriding method).Một lớp triển khai chính nó với thể là abstract và vì thế những phương thức interface ko cần được triển khai.

Xem thêm: Hướng Dẫn Đi Máy Bay Nội Địa Lần Đầu Đi Máy Bay, Thủ Tục Đi Máy Bay Nội Địa Cho Người Đi Lần Đầu

lúc triển khai interface, với vài quy tắc sau:

Một lớp với thể triển khai một hoặc nhiều interface tại một thời điểm.Một lớp chỉ với thể kế thừa một lớp khác, nhưng được triển khai nhiều interface.Một interface với thể kế thừa từ một interface khác, tương tự cách một lớp với 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, với thể cài đặt (implements) nhiều interface. Tuy nhiên, một interface với thể thừa kế (extends) nhiều interface.

Một interface ko thể cài đặt (implements) interface khác, do interface ko phần cài đặt, chỉ chứa những 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 ko được tư vấn thông qua lớp trong Java nhưng là với thể bởi Interface, tại sao?

Như đã giới thiệu, kế thừa ko được tư vấn thông qua lớp. Nhưng nó được tư vấn bởi Interface bởi vì ko với tính lưỡng nghĩa lúc 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 vserpuhove.com”); public static void main(String args) InterfaceDemo obj = new InterfaceDemo(); obj.print(); Trong ví dụ trên, interface PrintableShowable với cùng những 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ế ko với 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”); // ko 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(); // ko 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 với cùng những phương thức print() và InterfaceDemo kế thừa 2 class đó ko override lại phương thức print() nên trình biên dịch ko 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 ko tư vấn đa thừa kế đối với class.

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

Đó là một Interface mà ko với 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 với thể thực hiện một số hoạt động hữu ích.

Ví dụ

public interface Serializable với hai mục đích thiết kế đầy đủ 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á những interface khác trong Java API, khách tham quan với thể sử dụng một tagging interface để tạo một cha chung cho một nhóm interface. Ví dụ, lúc 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 ko 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 với thể với Interface khác, đó là lồng Interface.

Ví dụ:

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

So sánh abstract class và interface trong Java

Lớp trừu tượng (abstract class) Interface
Thể hiện tính trừu tượng Phiên bản Java 9, với thể thêm private methods.
Lớp trừu tượng ko tư vấn đa kế thừa Interface tư vấn đa kế thừa
Lớp trừu tượng với thể với những biến final, non-final, static và non-static Interface chỉ với những biến static final
Lớp trừu tượng với thể với phương thức static, phương thức main và constructor Interface ko thể với phương thức static, main hoặc constructor.
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
Lớp trừu tượng với thể cung cấp trình triển khai của Interface Interface ko cung cấp trình triển khai cụ thể của lớp abstract
Ví dụ: public abstract class Shape public abstract void draw(); Ví dụ: public interface Drawable void draw();
Sử dụng Abstract class lúc chúng ta chỉ với thể hoàn thành một vài chức năng (method/ function) chuẩn của hệ thống, một vài chức năng còn lại những lớp extends phải hoàn thành. Những tính năng đã hoàn thành này vẫn sử dụng như bình thường, đây là những tính năng chung. Sử dụng Interface lúc khách tham quan muốn tạo dựng một bộ khung chuẩn gồm những chức năng (method/ function) mà tất cả module/ project cần phải với. những module phải implements tất cả chức năng đã được định nghĩa.

Nói về Abtract Class và Interface, thường thì khách tham quan sẽ gặp một số cách gọi: lúc một class extend một class/ abtract class thì với nghĩa là ta đang thể hiện mối quan hệ is-a (là), còn lúc implement một interface, thì ta đang thể hiện mối quan hệ has-a (với, 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, với Width, Heightclass Rectangle extends Shape implements Width, Height Tài liệu tham khảo

Nguồn : Sưu tầm

Danh mục: Công lý
Nguồn: https://globalizethis.org

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button