Ẩn phần trong html

Để bật tính năng nhắn tin trên trang Facebook của bạn, hãy truy cập Trang của bạn Settings. Trong hàng Messages kiểm tra Cho phép mọi người liên hệ riêng với Trang của tôi bằng cách hiển thị nút Tin nhắn (Direct Link. https://www.facebook.com/{your-page-name}/settings/?tab=settings§ion=messages&view)

Một phương thức thể hiện trong một lớp con có cùng chữ ký (tên, cộng với số và loại tham số của nó) và kiểu trả về dưới dạng một phương thức thể hiện trong lớp cha sẽ ghi đè phương thức của lớp cha

Khả năng ghi đè phương thức của lớp con cho phép lớp kế thừa từ lớp cha có hành vi "đủ gần" và sau đó sửa đổi hành vi khi cần. Phương thức ghi đè có cùng tên, số lượng và loại tham số và kiểu trả về giống như phương thức mà nó ghi đè. Một phương thức ghi đè cũng có thể trả về một kiểu con của loại được trả về bởi phương thức ghi đè. Kiểu con này được gọi là kiểu trả về hiệp biến

Khi ghi đè một phương thức, bạn có thể muốn sử dụng chú thích

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
7 hướng dẫn trình biên dịch rằng bạn định ghi đè một phương thức trong lớp cha. Nếu vì một lý do nào đó, trình biên dịch phát hiện ra rằng phương thức này không tồn tại ở một trong các lớp cha, thì nó sẽ tạo ra lỗi. Để biết thêm thông tin về
public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
7, xem
public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
9

Phương thức tĩnh

Nếu một lớp con định nghĩa một phương thức tĩnh có cùng chữ ký với một phương thức tĩnh trong lớp cha, thì phương thức trong lớp con sẽ ẩn phương thức trong lớp cha

Sự khác biệt giữa ẩn phương thức tĩnh và ghi đè phương thức thể hiện có ý nghĩa quan trọng

  • Phiên bản của phương thức thể hiện bị ghi đè được gọi là phiên bản trong lớp con
  • Phiên bản của phương thức tĩnh ẩn được gọi tùy thuộc vào việc nó được gọi từ lớp cha hay lớp con

Hãy xem xét một ví dụ có chứa hai lớp. Đầu tiên là

The static method in Animal
The instance method in Cat
0, chứa một phương thức thể hiện và một phương thức tĩnh

public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}

Lớp thứ hai, một lớp con của

The static method in Animal
The instance method in Cat
0, được gọi là
The static method in Animal
The instance method in Cat
2

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

Lớp

The static method in Animal
The instance method in Cat
2 ghi đè phương thức cá thể trong
The static method in Animal
The instance method in Cat
0 và ẩn phương thức tĩnh trong
The static method in Animal
The instance method in Cat
0. Phương thức
The static method in Animal
The instance method in Cat
6 trong lớp này tạo một thể hiện của
The static method in Animal
The instance method in Cat
2 và gọi
The static method in Animal
The instance method in Cat
8 trên lớp và
The static method in Animal
The instance method in Cat
9 trên thể hiện

Đầu ra từ chương trình này như sau

The static method in Animal
The instance method in Cat

Như đã hứa, phiên bản của phương thức tĩnh ẩn được gọi là phiên bản trong lớp cha và phiên bản của phương thức thể hiện bị ghi đè được gọi là phiên bản trong lớp con

Các phương thức mặc định và phương thức trừu tượng trong giao diện được kế thừa giống như các phương thức thể hiện. Tuy nhiên, khi các siêu kiểu của một lớp hoặc giao diện cung cấp nhiều phương thức mặc định có cùng chữ ký, trình biên dịch Java sẽ tuân theo các quy tắc kế thừa để giải quyết xung đột tên. Các quy tắc này được thúc đẩy bởi hai nguyên tắc sau

  • Các phương thức sơ thẩm được ưu tiên hơn các phương thức mặc định của giao diện

    Hãy xem xét các lớp và giao diện sau

    public class Horse {
        public String identifyMyself() {
            return "I am a horse.";
        }
    }
    public interface Flyer {
        default public String identifyMyself() {
            return "I am able to fly.";
        }
    }
    public interface Mythical {
        default public String identifyMyself() {
            return "I am a mythical creature.";
        }
    }
    public class Pegasus extends Horse implements Flyer, Mythical {
        public static void main(String.. args) {
            Pegasus myApp = new Pegasus();
            System.out.println(myApp.identifyMyself());
        }
    }

    Phương thức

    public class Horse {
        public String identifyMyself() {
            return "I am a horse.";
        }
    }
    0 trả về chuỗi
    public class Horse {
        public String identifyMyself() {
            return "I am a horse.";
        }
    }
    1

  • Các phương thức đã bị ghi đè bởi các ứng cử viên khác sẽ bị bỏ qua. Trường hợp này có thể phát sinh khi siêu kiểu chia sẻ một tổ tiên chung

    Hãy xem xét các giao diện và lớp sau

    public interface Animal {
        default public String identifyMyself() {
            return "I am an animal.";
        }
    }
    public interface EggLayer extends Animal {
        default public String identifyMyself() {
            return "I am able to lay eggs.";
        }
    }
    public interface FireBreather extends Animal { }
    public class Cat extends Animal {
        public static void testClassMethod() {
            System.out.println("The static method in Cat");
        }
        public void testInstanceMethod() {
            System.out.println("The instance method in Cat");
        }
    
        public static void main(String[] args) {
            Cat myCat = new Cat();
            Animal myAnimal = myCat;
            Animal.testClassMethod();
            myAnimal.testInstanceMethod();
        }
    }
    
    0

    Phương thức

    public class Horse {
        public String identifyMyself() {
            return "I am a horse.";
        }
    }
    2 trả về chuỗi
    public class Horse {
        public String identifyMyself() {
            return "I am a horse.";
        }
    }
    3

Nếu hai hoặc nhiều phương thức mặc định được xác định độc lập xung đột hoặc một phương thức mặc định xung đột với một phương thức trừu tượng, thì trình biên dịch Java sẽ tạo ra lỗi trình biên dịch. Bạn phải ghi đè rõ ràng các phương thức siêu kiểu

Hãy xem xét ví dụ về ô tô điều khiển bằng máy tính hiện có thể bay. Bạn có hai giao diện (

public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
4 và
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
5) cung cấp các triển khai mặc định cho cùng một phương thức, (
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
6)

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
1
public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
2

Một lớp triển khai cả

public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
4 và
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
5 phải ghi đè phương thức
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
6. Bạn có thể gọi bất kỳ triển khai mặc định nào bằng từ khóa
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
0

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
3

Tên trước

public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
0 (trong ví dụ này,
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
5 hoặc
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
4) phải tham chiếu đến một siêu giao diện trực tiếp xác định hoặc kế thừa một giá trị mặc định cho phương thức được gọi. Hình thức gọi phương thức này không bị hạn chế trong việc phân biệt giữa nhiều giao diện được triển khai có chứa các phương thức mặc định có cùng chữ ký. Bạn có thể sử dụng từ khóa
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
0 để gọi phương thức mặc định trong cả lớp và giao diện

Các phương thức thể hiện được kế thừa từ các lớp có thể ghi đè các phương thức giao diện trừu tượng. Hãy xem xét các giao diện và lớp sau

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
4

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
5

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
6

Phương thức

public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
5 trả về chuỗi
public class Horse {
    public String identifyMyself() {
        return "I am a horse.";
    }
}
1 Lớp
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
7 kế thừa phương thức
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
8 từ lớp
public interface Flyer {
    default public String identifyMyself() {
        return "I am able to fly.";
    }
}
9, phương thức này sẽ ghi đè phương thức trừu tượng cùng tên trong giao diện
public interface Mythical {
    default public String identifyMyself() {
        return "I am a mythical creature.";
    }
}
0

Ghi chú. Các phương thức tĩnh trong giao diện không bao giờ được kế thừa

sửa đổi

Trình xác định quyền truy cập cho một phương thức ghi đè có thể cho phép truy cập nhiều hơn nhưng không ít hơn so với phương thức bị ghi đè. Ví dụ: một phương thức thể hiện được bảo vệ trong lớp cha có thể được đặt ở chế độ công khai, nhưng không được đặt ở chế độ riêng tư trong lớp con

Bạn sẽ gặp lỗi thời gian biên dịch nếu bạn cố gắng thay đổi một phương thức thể hiện trong lớp cha thành một phương thức tĩnh trong lớp con và ngược lại

Tóm lược

Bảng sau đây tóm tắt những gì xảy ra khi bạn định nghĩa một phương thức có cùng chữ ký với một phương thức trong lớp cha