Путать с интерфейсом JAVA

Возможный дубликат:
Что значит "программировать интерфейс" ?
Интерфейс против абстрактного класса (общий OO)

Я новичок в изучении JAVA, и теперь я запутался в интерфейсе. Я искал и читал много материалов, но до сих пор не ясно.

Когда я пытаюсь найти некоторую информацию об интерфейсе, я вижу, что многие люди говорили о взаимосвязи между интерфейсом и абстрактным классом. Но я даже не знаю, почему они противопоставляют эти два. Поскольку я считаю, что абстрактный класс используется, чтобы рассказать другим людям, вы не можете создать объект этого абстрактного класса, и если хотите, вы должны изменить абстрактный класс. Это что-то о наследовании, верно?

Но я не знаю смысла интерфейса. Существует interface a, и если a class B собирается реализовать интерфейс a, он должен использовать зарезервированное слово class B implements a, а затем завершить все методы, требуемые интерфейсом. Но мой вопрос заключается в том, что если класс B должен выполнить все методы сам по себе, каково значение интерфейса? Думаю, нам это не нужно. Я этого не понимаю. Я читал множество предложений вроде: "интерфейс может отражать основную мысль объектно-ориентированного языка", "интерфейс может помочь сделать программу проще" и т.д. Но я не могу понять смысл.

Итак, может ли кто-нибудь показать мне несколько примеров, чтобы понять интерфейс? Или вы можете сказать мне полезные ссылки или книги, которые четко описывают интерфейс. Я действительно надеюсь понять это. СПАСИБО!

Ответ 1

Предположим, что у вас класс Car class и Vegetable, который не имеет отношения к реальной жизни, и существует общее поведение, называемое wash(). Потому что мы можем мыть машину и мыть овощ тоже. Но мытье машины и мойка овощей - это совершенно другой процесс/поведение.

Для примера: Car следует промыть силовым насосом Vegetables под кухонной раковиной. Таким образом, способ стирки отличается. Таким образом, вы делаете процесс стирки как метод wash() в интерфейсе, скажем Washable, и реализуете его как в классах Car, так и Vegetable.

interface Washable {

 public void wash();

} 

public class Car implements Washable {

 public void wash() {

   // wash the car with a power pump

 }


}

public class Vegetable implements Washable {

public void wash() {

   // wash the vegetable under a kitchen sink

 }


}

Как человек, вы хотели бы мыть машину, а также овощи.

public class Person  {


Washable washableObject = new Car();

washableObject.wash();

washableObject = new Vegetable();

washableObject.wash();




}
  • Таким образом, интерфейс - это способ подключения несвязанных классов, которые имеют общее поведение. Но поведение будет иначе реализовано или может быть изменено в будущем.

  • В один прекрасный день вы решите изменить способ стирки автомобиля. Предположите, что вы приобрели "автомойку". Таким образом, реализация изменяется внутри метода wash() в классе Car.

    Открытый класс Car реализует Washable {

      public void wash() {
    
       // wash the car with my new car washing machine !!
    
     }
    

    }

Но как человек вы все равно вызываете метод wash(). Способ, которым реализуется метод wash(), изменен (стирка автомобиля с помощью вашей новой стиральной машины), это изменение реализации не повлияло на ваш класс Person.

Надеюсь, вы поняли, почему мы теперь используем interfaces.

Ответ 2

В принципе, interface - это способ выполнения множественного наследования без фактического выполнения. (Что не означает, что люди Java "вымотаны" - множественное наследование чрезвычайно беспорядочно и неэффективно реализовать.)

Это означает, что вы можете иметь два полностью отдельных класса A и B, без общего предка, кроме Object, и, если они реализуют один и тот же interface, вы можете заменить один на другой (так долго поскольку вы ссылаетесь только на методы в интерфейсе).

Ответ 3

Подумайте о таких интерфейсах, как контракты между классом и пользователем. Когда класс реализует интерфейс, он говорит, что он обещает предложить все методы, определенные интерфейсом.

Ответ 4

Предполагая, что вы понимаете наследование классов, я думаю о интерфейсе, как о скелетном классе, где описывается структура класса, но не написана/реализована.

Другой класс может работать с любым классом, который реализует определенный интерфейс, даже если он еще не реализован.

Например, кто-то может создать интерфейс под названием Animal. Его методы могут быть: Talk(), Walk() и Eat(). Вы можете написать класс Dog, который реализует Animal, который печатает "woof" при вызове метода Talk(). Поэтому другой класс будет знать, как работать со всеми классами, реализующими интерфейс Animal.

UPD

Хорошим примером реального мира является интерфейс JDBC Database Statement. Это задает ряд требуемых свойств, которые должен реализовать разработчик базы данных, например execute(String sql). Oracle будет реализовывать это иначе, чем Postgresql. Это позволяет обменять базу данных на другую, но код пользователя остается прежним.

Ответ 5

Простой код для понимания интерфейса и класса.

import java.util.List;
import java.util.ArrayList;
public class Q01 {
List<Shape> shapes= new ArrayList();

public void add() {
    shapes.add(new Square(3.0));
    shapes.add(new Circle(2.0));
}
public void print() {
    for (int i = 0; i < shapes.size(); i++) {
        Shape shape = shapes.get(i);
        System.out.println(shape.getClass().getSimpleName() + " --->" + shape.getArea());
    }
}

public static void main(String[] args) {
    Q01 q01= new Q01();
    q01.add();
    q01.print();
}

public interface Shape {
    double getArea();
}

public class Square implements Shape{
    private double edge;

    public Square(double edge) {
        this.edge = edge;
    }
    public double getArea() {
        return edge*edge;
    }
}
public class Circle implements Shape{
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getArea() {
        return 3.14 * radius * radius;
    }
}
}