Top 11 # Xem Nhiều Nhất Interface Là Gì Trong Java Mới Nhất 5/2023 # Top Like | Sieuphampanorama.com

Functional Interface Là Gì? Functional Interface Api Trong Java 8

Functional Interface là gì? Functional Interface API trong Java 8

Functional Interface là interface có duy nhất 1 method trừu tượng (có thể có thêm các method không trừu tượng bằng từ khóa default trong Java 8) Ví dụ: Comparable là 1 Functional Interface với method trừu tượng duy nhất compareTo; Runnable là 1 Functional Interface với method trừu tượng duy nhất run …

Về annotation @FunctionalInterface: nó được dùng ở trước mỗi interface để khai báo đây là 1 functional interface.

@FunctionalInterface public interface Runnable { public abstract void run(); }

Việc dùng annotation @FunctionalInterface là không bắt buộc nhưng nó giúp đảm bảo cho quá trình compile. Ví dụ bạn khai báo @FunctionalInterface nhưng trong interface lại có nhiều hơn 2 method trừu tượng thì nó sẽ báo lỗi.

Java 8 xây dựng sẵn một số functional interface và nó được dùng nhiều trong các biểu thức lambda:

2.1. java.util.function.Consumer

package java.util.function; import java.util.Objects; @FunctionalInterface void accept(T t); }

consumer thường được dùng với list, stream để xử lý với các phần tử bên trong.

// Sử dụng List.forEach(Consumer) để in ra giá trị của các phần tử trong list @Override public void accept(String t) { System.out.println(t); } });

// Sử dụng List.forEach(Consumer) với cú pháp lambda expression:

Kết quả:

stack java stackjava.com ---------------- stack java stackjava.com

2.2. java.util.function.Predicate

package java.util.function; import java.util.Objects; @FunctionalInterface boolean test(T t); }

predicate thường được dùng với list, stream để kiểm tra từng phần tử lúc xóa, lọc…

list.add(-1); list.add(1); list.add(0); list.add(-2); list.add(3);

// lệnh removeIf sẽ thực hiện duyệt từng phần tử, @Override public boolean test(Integer t) { return t < 0; } });

// Sử dụng Predicate với cú pháp Lambda Expression

Kết quả:

1 0 3 ----------------------------- 1 0

2.3. java.util.function.Function

package java.util.function; import java.util.Objects; @FunctionalInterface R apply(T t); }

Function thường dùng với Stream khi muốn thay đổi giá trị cho từng phần tử trong stream.

// chuyển tất cả các phần tử của stream thành chữ in hoa @Override public String apply(String t) { return t.toUpperCase(); }

stream = list.stream();// lưu ý là stream ko thể dùng lại nên phải khởi tạo lại

Kết quả:

STACK JAVA DEMO FUNCTION --------------- stack java demo function

Một số Function interface tương tự:

2.4. java.util.function.Supplier

package java.util.function; @FunctionalInterface T get(); } Random random = new Random(); @Override public Integer get() { return random.nextInt(10); } }).limit(5);

Kết quả:

4 9 8 5 8 -------------------- 2 2 9 9 6

References:

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

Khai Báo Interface Trong Java, Hằng Số Với Interface

Khai báo interface trong Java, hằng số với interface.

Khai báo interface

Một interface là một source file được khai báo với từ khóa interface chứ không phải class

Khi bạn tạo một interface tức là bạn đang định nghĩa những gì mà class có thể làm mà không nói gì đến nó làm như thế nào.

Ví dụ bạn định nghĩa interface PeopleAction với các hành động như work(), study()… Class Student và Employee thực hiện cài đặt (implements) lại interface PeopleAction tức là 2 class Student và Employee có thể và bắt buộc cài đặt lại word() và study() còn cài đặt như nào thì mỗi class lại có cách cài đặt khác nhau.

Một interface có thể extends nhiều interface khác (không thể implements interface)

Một class có thể implements nhiều interface.

Không thể sử dụng từ khóa final khi khai báo interface (vì interface sinh ra để những thằng khác thừa kế)

Tất cả các method trong interface đều được ngầm hiểu là public abstract (Từ Java 8 cho phép thêm method không phải là abstract vào interface bằng từ khóa default; Từ Java 9 cho phép thêm method private và private static vào Interface)

Các method trong interface không thể khai báo với từ khóa static

Vì các method trong interface là abstract nên nó cũng không thể khai báo với từ khóa final, strictfp, native

Tất cả các biến trong interface đều được ngầm nhiều là public static final.

Bạn được phép khai báo các hằng số bên trong một interface. Bằng cách này bạn đảm bảo được rằng các class cùng thừa kế interface sẽ được truy cập vào cùng 1 hằng số.

Ví dụ:

public interface Common { int MAX_CONNECTION = 100; }

Khi cần sử dụng hằng số MAX_CONNECTION ta chỉ cần gọi Common.MAX_CONNECTION

Việc khai báo hằng số trong inteface lợi thế hơn việc khai báo hằng số trong class vì tất cả các biến trong interface đều được ngầm nhiều là public static final, ta có thể chắc chắn nó là hằng số và không bị thay đổi giá trị.

Khai báo interface trong Java, hằng số với interface chúng tôi

References:

Interface Là Gì? Interface Khác Gì Class? Đa Kế Thừa Trong Java Sử Dụng Interface Như Thế Nào? Ví Dụ Minh Họa

Trong bài viết này chúng ta sẽ đi trả lời những câu hỏi về interface: Đặc điểm của interface? So sánh interface với Class? Đa thừa kế trong Java sử dụng Interface như thế nào? Marker (hay Tagging) Interface là gì? Interface lồng nhau trong Java? Cùng với các ví dụ minh họa

1. 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.

2. Điểm giống và khác nhau giữa Interface và Class

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.

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

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), …

Shape.java

public interface Shape { String color = "red"; void draw(); }

Rectangle.java

public class Rectangle implements Shape { @Override public void draw() { System.out.println("Draw " + color + " rectangle"); } }

Circle.java

public class Circle implements Shape { @Override public 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(); Shape circle = new Circle(); circle.draw(); } }

Kết quả:

Draw red rectangle --- Draw red circle

4. Một vài lưu ý

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

Các checked exception không 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 các 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ì khi ghi đè phương thức (overriding method).

Một lớp triển khai chính nó có thể là abstract và vì thế các phương thức interface không cần được triển khai.

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.

5. Đa thừa kế trong Java sử dụng 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 { @Override public void draw() { System.out.println("Draw " + this.getColor() + " rectangle"); } @Override public 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 { @Override public void draw() { System.out.println("Draw " + this.getColor() + " circle"); } @Override public 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 gpcoder.com"); } public static void main(String args[]) { InterfaceDemo obj = new InterfaceDemo(); obj.print(); } }

Trong ví dụ trên, interface Printable và Showable 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"); } } public class InterfaceDemo extends Printable, Showable { public static void main(String args[]) { InterfaceDemo obj = new InterfaceDemo(); obj.print(); } }

Trong ví dụ trên, lớp Printable và Showable 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.

Ví dụ:

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

Bài 15: Abstract Class Và Interface Trong Java

Một lớp được khai báo với từ khóa abstract là lớp abstract trong Java. Lớp abstract có nghĩa là lớp trừu tượng, nó có thể có các phương thức abstract hoặc non-abtract.

Lớp trừu tượng có thể không khai báo hoặc khai báo nhiều method trừu tượng bên trong.

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.

&ltaccess modifier&gt abstract class &ltclass name&gt { }

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.

&ltaccess modifier&gt abstract void &ltmethod name&gt();

Ví dụ: Viết chương trình tạo ra các phương tiện giao thông sao cho cách tạo ra là giống nhau. Phương tiện đó có thể là ô tô, xe máy, xe đạp,…

package com.company; public abstract class Vehicle { public Vehicle() { } public abstract void create(); } package com.company; public class Bike extends Vehicle { @Override public void create() { System.out.println("Create Bike..."); } } package com.company; public class Moto extends Vehicle { @Override public void create() { System.out.println("Create Moto..."); } } package com.company; public class Main { public static void main(String args[]) { Vehicle moto = new Moto(); moto.create(); Vehicle bike = new Bike(); bike.create(); } }

Kết quả trả về khi chạy chương trình:

Create Moto... Create Bike...

Interface có những đặc điểm sau:

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

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.

Ví dụ: Vẫn yêu cầu như phần Abstract class, nhưng chúng ta sẽ sử dụng interface.

package com.company; public interface Vehicle { public void create(); } package com.company; public class Bike implements Vehicle { @Override public void create() { System.out.println("Create Bike..."); } } package com.company; public class Moto implements Vehicle { @Override public void create() { System.out.println("Create Moto..."); } } package com.company; public class Main { public static void main(String args[]) { Vehicle moto = new Moto(); moto.create(); Vehicle bike = new Bike(); bike.create(); } }

Kết quả thu được như phần Abstract class.

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ụ: 1 người vừa làm giáo viên, vừa làm bác sĩ. Ta xây dựng các lớp như sau

package com.company; public interface Teacher { public void teaching(); } package com.company; public interface Doctor { public void injecting(); } package com.company; public class People implements Doctor,Teacher { @Override public void injecting() { System.out.println("Injecting..."); } @Override public void teaching() { System.out.println("Teaching..."); } } package com.company; public class Main { public static void main(String args[]) { People people = new People(); people.teaching(); people.injecting(); } } Abstract class Interface

Multiple inheritance

Không hỗ trợ đa thừa kế

Một class có thể hiện thực nhiều interface.(tạm coi là thừa kế)

Default implementation

Có thể định nghĩa thân phương thức, property

Không thể định nghĩa code xử lý, chỉ có thể khai báo.

Access Modifiers

Có thể xác định modifier

Mọi phương thức, property đều mặc định là public.

Adding functionality

Không cần thiết

Mọi phương thức, property của interface cần được hiện thực trong class.

Nói về Abtract class và Interface, đôi khi bạn sẽ gặp một số cách gọi: Khi một lớp kế thừa 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).