English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В данном курсе мы изучим Java интерфейсы. Мы будем использовать примеры для изучения того, как реализовывать интерфейсы и когда их использовать.
В Java интерфейс определяет набор спецификаций, которые должны быть реализованы другими классами. Например,
interface Polygon { public void getArea(); {}
Здесь Polygon является интерфейсом. Мы используем ключевое слово interface для объявления интерфейса.
Метод getArea() является спецификацией, определенной в интерфейсе Polygon. Все классы, использующие этот интерфейс, должны реализовать метод getArea().
Интерфейс может содержать абстрактные методы и константы. Например,
interface Polygon { public static final String цвет = "blue"; public void getArea(); {}
В данном примере мы создали интерфейс Polygon. Он включает константное поле color и абстрактный метод getArea().
Важно отметить, что все методы в интерфейсе являются имплицитно public, все поля имплицитно public static final. Поэтому не нужно указывать доступность в интерфейсе. Например, мы можем записать上面的 код следующим образом
interface Polygon { String цвет = "blue"; void getArea(); {}
Как и в абстрактных классах, мы не можем создать объект интерфейса. Но мы можем реализовать интерфейс в других классах. В Java мы используем ключевое слово implements для реализации интерфейса. Например,
interface Polygon { void getArea(int длина, int ширина); {} class Rectangle implements Polygon { public void getArea(int длина, int ширина) { System.out.println("Площадь прямоугольника составляет " + (длина * ширина)); {} {} class Main { public static void main(String[] args) { Rectangle r1 = new Rectangle(); r1.getArea(5, 6); {} {}
Результат вывода
Площадь прямоугольника составляет 30
В примере выше мы создали интерфейс Polygon. Интерфейс Polygon имеет абстрактный метод getArea().
Это означает, что любой класс, реализующий Polygon, обязан предоставить реализацию метода getArea().
Обратите внимание, что класс Rectangle (реализующий интерфейс Polygon) имеет метод с реализацией getArea().
Теперь, когда мы знаем, что такое интерфейс, давайте узнаем, почему его используют в Java.
Интерфейс предоставляет стандарты, которые классы (реализующие его) должны соблюдать.
В примере выше мы использовали getArea() в качестве стандарта для интерфейса Polygon. Это как установить правило, что我们应该 быть able to получить площадь каждого многоугольника. Поэтому любой класс, реализующий интерфейс Polygon, обязан предоставить реализацию метода getArea().
Как и абстрактные классы, интерфейсы помогают нам реализовать абстрактность в Java. Здесь我们知道, что getArea() вычисляет площадь многоугольника, но для разных многоугольников способ вычисления площади различается. Поэтому реализации getArea() независимы друг от друга.
Интерфейсы также используются для реализации多重 наследования в Java. Если подкласс наследуется от двух или более классов, то это多重 наследование.
В Java多重 наследование классов реализовать невозможно. Однако один класс может реализовывать несколько интерфейсов. Это позволяет нам получить функциональность多重 наследования в Java. Например,
интерфейс Line { ... {} interface Polygon { ... {} class Rectangle implements Line, Polygon{ ... {}
Здесь класс Rectangle обязан предоставить реализацию всех методов Line и Polygon.
В Java 8 интерфейсы теперь могут содержать статические методы.
Как и в случае с классами, мы можем использовать ссылку для доступа к статическим методам интерфейса. Например,
Polygon.staticMethod();
Кроме того, с发行кой Java 9 интерфейсы поддерживают приватные методы. Теперь вы можете использовать в интерфейсеПриватные методыиПриватные статические методы.
Поскольку интерфейс не может быть инстанцирован,私有ные методы используются в качестве вспомогательных методов для поддержки других методов в интерфейсе.
В Java 8 в интерфейсах были введены методы с реализацией (методы по умолчанию). До этого все методы были абстрактными методами в Java.
Для объявления метода по умолчанию в интерфейсе мы используем ключевое слово default. Например,
public default void getSides() { // Основной контент метода getSides() {}
Давайте рассмотрим сцену, чтобы понять, почему Java ввел метод по умолчанию.
Предположим, что нам нужно добавить новый метод в интерфейс.
Мы можем легко добавить этот метод в интерфейс, не выполняя никаких действий. Но это еще не конец истории. Все классы, реализующие этот интерфейс, должны предоставить реализацию этого метода.
Если большое количество классов реализует этот интерфейс, нам нужно отслеживать все эти классы и вносить в них изменения. Это не только сложно, но и легко ошибиться.
Чтобы решить эту проблему, Java ввел метод по умолчанию. Метод по умолчанию наследуется как обычный метод.
Давайте рассмотрим пример, чтобы лучше понять метод по умолчанию.
interface Polygon { void getArea(); default void getSides() { System.out.println("Я могу получить количество сторон многоугольника."); {} {} class Rectangle implements Polygon { public void getArea() { int length = 6; int breadth = 5; int area = length * breadth; System.out.println("Площадь прямоугольника составляет " + area); {} public void getSides() { System.out.println("У меня есть четыре стороны."); {} {} class Square implements Polygon { public void getArea() { int length = 5; int area = length * length; System.out.println("Площадь квадрата составляет " + area); {} {} class Main { public static void main(String[] args) { Rectangle r1 = new Rectangle(); r1.getArea(); r1.getSides(); Square s1 = new Square(); s1.getArea(); {} {}
Результат вывода
Площадь прямоугольника составляет 30 У меня есть четыре стороны. Площадь квадрата составляет 25
В приведенном выше примере мы создали интерфейс Polygon. У Polygon есть метод по умолчанию getSides() и абстрактный метод getArea().
Затем класс Rectangle реализует интерфейс Polygon, Rectangle предоставляет реализацию абстрактного метода getArea() и переопределяет метод getSides() по умолчанию.
Мы создали еще один класс Square, который также реализует интерфейс Polygon. В данном случае Square предоставляет реализацию абстрактного метода getArea().
Давайте посмотрим на более практичный пример Java интерфейса.
// Использование функции sqrt import java.lang.Math; interface Polygon { void getArea(); // Вычисление периметра многоугольника default void getPerimeter(int... sides) { int perimeter = 0; for (int side : sides) { perimeter += side; {} System.out.println("Периметр: " + perimeter); {} {} class Triangle implements Polygon { private int a, b, c; private double s, area; // Инициализация сторон треугольника Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; s = 0; {} // Вычисление площади треугольника public void getArea() { s = (double) (a + b + c) / 2; area = Math.sqrt(s * (s - a) * (s - b) * (s - c)); System.out.println("Площадь: " + area); {} {} class Main { public static void main(String[] args) { Triangle t1 = new Triangle(2, 3, 4); // Вызов метода класса Triangle t1.getArea(); // Вызов метода класса Polygon t1.getPerimeter(2, 3, 4); {} {}
Результат вывода
Площадь: 2.9047375096555625 Периметр: 9
В предыдущем примере программы мы создали интерфейс Polygon. Он включает в себя метод по умолчанию getParameter() и абстрактный метод getArea().
Мы можем вычислять периметр всех многоугольников одним и тем же способом, поэтому в классе Polygon мы реализовали的主体 getPerimeter(). Теперь все многоугольники, реализующие Polygon, могут использовать getPerimeter() для вычисления периметра.
Но способ вычисления площади различается для различных многоугольников, так как правила вычисления площади различаются для различных многоугольников.
Таким образом, в Polygon не реализован и включен getArea(). И любая класс, реализующий интерфейс Polygon, должна предоставить реализацию getArea().
Как и классы, интерфейсы могут наследовать другие интерфейсы, для наследования интерфейса используется ключевое слово extends. Например:
интерфейс Line { //Члены интерфейса Line {} интерфейс Polygon extends Line { //Члены интерфейса Polygon и Line {}
В上面的 примере интерфейс Polygon наследует интерфейс Line. Теперь, если класс реализует Polygon, то он должен предоставить реализацию всех абстрактных классов Line и Polygon.
Обратите внимание, что интерфейс может наследовать несколько интерфейсов, подобно классу, реализующему несколько интерфейсов. Например:
интерфейс A { ... {} интерфейс B { ... {} Интерфейс C extends A, B { ... {}