+3

Một số câu hỏi hay về Java

1. Có thể khai báo staic trong interface không?

Có nha, phương thức trong interface mà khai báo là static thì phương thức đó thuộc interface và có thể truy cập thông qua interface đó.

    interface Interface {
        static void myMethod() {
            System.out.println("static");
        }
    }
    public class Test implements Interface{
        public static void main(String[] args) {
            Test o = new Test();
            Interface.myMethod();
        }
    }

Kết quả là : "static".

Ngoài ra, chúng ta có thể override lại phương thức static cho class implement phương thức đó.

    interface Interface {
        static void myMethod() {
            System.out.println("static");
        }
    }
    public class Test implements Interface{
        public void myMethod() {
            System.out.println("static override");
        }
        public static void main(String[] args) {
            Test o = new Test();
            o.myMethod();
            Interface.myMethod();
        }
    }

Kết quả là: "static override" "static".

2. Có thể khai báo final trong interface không?

Có, từ khóa final để chỉ định rằng một biến không thể được gán lại giá trị sau khi được khởi tạo. Vì vậy mà các lớp triển khai interface đó không thể gán lại giá trị của biến đó.

Note: Khi khai báo một biến trong interface thì phải gán luôn giá trị và biến đó trở thành biến final, publicstatic luôn. Vì vậy mà biến này thuộc Interface chứ không thuộc instances của class implement nó.

3. Có thể định nghĩa phần thân phương thức trong interface không?

Trong java thuần chúng ta thường được dạy ở trên trường học là interface khác với abstract class ở chỗ nó chỉ được định nghĩa method chứ không có phần thân method. Nhưng với Java 8, chúng ta có thể định nghĩa phần thân method trong interface với từ khóa default;

Example:

    interface Interface {
        default void display() {
            System.out.println("This is default method of Interface");
        }
    }

Note:

Chúng ta có thể sử dụng default method này như abstract method hoặc chúng ta có thể overridding lại phương thức này ở class chúng ta inplements Interface này.

4. Có thể triển khai 2 Interface có hai method giống nhau hay không?

Câu trả lời là có. Nhưng, với một điều kiện là phải override lại phương thức trên.

Example:

    interface Interface1 {
        default void display() {
            System.out.println("This is display method of Interface1");
        }
    }
    interface Interface2 {
        default void display() {
            System.out.println("This is display method of Interface2");
        }
    }
    public class Test implements Interface1, Interface2 {

        public void display() {
            System.out.println("overrided");
        }

        public static void main(String[] args) {
            Test o = new Test();
            o.display();
        }
    }

Như vậy, kết quả khi chay hàm main() sẽ là "overrided".

Vậy nếu tôi không muốn viết lại một hàm mới mà tôi muốn gọi phương thức đã định nghĩa sẵn ở Interface1 or Interface2 thì sao? --> Thì bạn chỉ cần override lại phương thức đó và ở trong đó bạn gọi lại phương thức bạn cần là xong:

    public class Test implements Interface1, Interface2 {

        public void display() {
            Interface1.super.display();
            //Or
            // Interface2.super.display();
        }
    }

5. Trong Java, có thể implements tối đa bao nhiêu interface?

Lần ấy tui phỏng vấn fresher, tui nghe xong kiểu: "Ủa gì zậy? Ai hỏi gì kỳ cục zậy?". Và tui hông biết trả lời làm sao cả. Rồi tui kêu là chắc chả có giới hạn gì đâu. Bởi nó mà có giới hạn thì người ta đã nhắc nhiều trong lúc học rồi.

Thực ra là có nha mọi người. Theo orecle, mỗi class hay mỗi interface đều có một giới hạn số lượng số dòng byte nhất định: 65535(2^16-1) entries by the 16-bit constant_pool_count field of the ClassFile structure. Như vậy số lượng tối đa interface có thể được implements phụ thuộc vào số dòng byte codes được biên dịch ra hay độ phức tạp của class.

(Những kiến thức mình chia sẻ ở trên, đa phần là do mình tự tìm hiểu nên có thể không tránh được nhiều sai sót. Vì vậy nếu có sai sót gì, mong mọi người hay comment cho mình biết với ạ, mình cảm ơn!).


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.