Подтвердить что ты не робот

Разница между статическими и стандартными методами в интерфейсе

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

public interface interfacesample2 {
    public static void method() {
        System.out.println("hello world");
    }

    public default void menthod3() {
        System.out.println("default print");
    }
}

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

4b9b3361

Ответ 1

Различия между статическими и стандартными методами в Java 8:

1) Стандартные методы могут быть переопределены в классе реализации, а static не может.

2) Статический метод относится только к классу только, поэтому вы можете использовать только статический метод для класса Interface, а не для класса, реализующего этот интерфейс, см.

public interface MyInterface {
    default void defaultMethod(){
        System.out.println("Default");
    }

    static void staticMethod(){
        System.out.println("Static");
    }    
}

public class MyClass implements MyInterface {

    public static void main(String[] args) {

        MyClass.staticMethod(); //not valid - static method may be invoked on containing interface class only
        MyInterface.staticMethod(); //valid
    }
}

3) Оба класса и интерфейса могут иметь статические методы с одинаковыми именами и не переопределяют другие!

public class MyClass implements MyInterface {

    public static void main(String[] args) {

        //both are valid and have different behaviour
        MyClass.staticMethod();
        MyInterface.staticMethod();
    }

    static void staticMethod(){
        System.out.println("another static..");
    }
}

Ответ 2

Статический метод - это метод, который относится к пространству имен классов, так сказать. Таким образом, метод static foo интерфейса Interface доступен Interface.foo(). Обратите внимание, что вызов функции не применяется к какому-либо конкретному экземпляру интерфейса.

С другой стороны, реализация по умолчанию bar вызывается

Interface x = new ConcreteClass();
x.bar();

Метод интерфейса static не может знать о переменной this, но реализация по умолчанию может.

Ответ 3

1. объяснить разницу между двумя

Статические методы интерфейса похожи на методы статического класса (здесь они принадлежат только интерфейсу). Где как интерфейсные методы по default implementation обеспечивают default implementation интерфейсных методов по default implementation (которые реализующие классы могут override)
Но помните, что если класс implementing more than one interface with same default сигнатурой метода по implementing more than one interface with same default тогда реализующий класс needs to override the default method

Вы можете найти простой пример ниже (можно DIY для разных случаев)

public class Test {
    public static void main(String[] args) {
        // Accessing the static member
        I1.hello();

        // Anonymous class Not overriding the default method
        I1 t = new I1() {
            @Override
            public void test() {
                System.out.println("Anonymous test");
            }
        };
        t.test();
        t.hello("uvw");

        // Referring to class instance with overridden default method
        I1 t1 = new Test2();
        t1.test();
        t1.hello("xyz");

    }
}

interface I1 {

    void test();
    //static method
    static void hello() {
        System.out.println("hello from Interface I1");
    }

    // default need not to be implemented by implementing class
    default void hello(String name) {
        System.out.println("Hello " + name);
    }
}

class Test2 implements I1 {
    @Override
    public void test() {
        System.out.println("testing 1234...");
    }

    @Override
    public void hello(String name) {
        System.out.println("bonjour" + name);
    }
}

2. когда мы будем использовать это было бы хорошо.

Это зависит от вашей постановки проблемы. Я бы сказал, что методы по умолчанию полезны, если вам нужна одна и та же реализация для метода в вашей спецификации во всех классах этого контракта, или он может использоваться как классы Adapter.

Вот хорошее прочтение: https://softwareengineering.stackexchange.com/questions/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread

также ниже oracle doc объясняет стандартные и статические методы для развития существующих интерфейсов:

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

http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html

Ответ 4

Эта ссылка содержит некоторые полезные сведения, здесь перечислены некоторые из них.

по умолчанию и статические методы уменьшили различия между классами interfaces и abstract.

Интерфейс по умолчанию:

  • Это помогает избежать использования классов утилиты, например, весь метод класса Collections может быть предоставлен в самих интерфейсах.
  • Это помогает расширять интерфейсы, не опасаясь сломать классы реализации.

Интерфейс статические методы:

  • Они являются частью интерфейса, мы не можем использовать его для объектов класса реализации.
  • Это помогает обеспечить безопасность, не позволяя классам реализации переопределять их.

Как процитировать другую полезную ссылку.

Ответ 5

Это лучше всего объяснить в документации Oracle.

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

На мой (возможно, наивный) взгляд, не было необходимости нарушать подобные интерфейсы. Интерфейсы всегда были контрактом, который вы должны выполнить, и это очень простая и чистая концепция. Теперь это смесь нескольких вещей. По моему мнению:

static methods do not belong to interfaces. They belong to utility classes.
"default" methods shouldn't have been allowed in interfaces at all. You could always use an abstract class for this purpose.

Короче:

До Java 8

  • Вы можете использовать абстрактные и обычные классы для предоставления статических и стандартных методов. Роль интерфейсов понятна.
  • Все методы в интерфейсе должны быть переопределены путем реализации классов.
  • Вы не можете добавить новый метод в интерфейс без изменения всех реализаций, но на самом деле это хорошая вещь.

После Java 8

  • Практически нет разницы между интерфейсом и абстрактным классом (кроме множественного наследования). На самом деле вы можете эмулировать обычный класс с интерфейсом.
  • При программировании реализаций программисты могут забыть переопределить методы по умолчанию.
  • Существует ошибка компиляции, если класс пытается реализовать два или более интерфейса, имеющих метод по умолчанию с одинаковой сигнатурой.
  • Добавляя метод по умолчанию к интерфейсу, каждый реализующий класс автоматически наследует это поведение. Некоторые из этих классов, возможно, не были разработаны с учетом этой новой функциональности, и это может вызвать проблемы. Например, если кто-то добавляет новый метод по умолчанию void foo() по умолчанию к интерфейсу Ix, класс Cx, реализующий Ix и имеющий закрытый метод foo с той же сигнатурой, не компилируется.

Ответ 6

Вот мой взгляд:

статический метод в интерфейсе:

  • Вы можете вызвать его напрямую (InterfacetA.staticMethod())

  • Подкласс не сможет переопределить.

  • Подкласс может иметь метод с тем же именем, что и staticMethod

метод по умолчанию в интерфейсе:

  • Вы не можете позвонить прямо.

  • Подкласс сможет переопределить его

Преимущество:

  • Статический метод: вам не нужно создавать отдельный класс для служебного метода.

  • Метод по умолчанию: Предоставить общую функциональность в методе по умолчанию.

Ответ 7

Согласно Oracle Javadocs: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

Способы по умолчанию позволяют добавлять новые функциональные возможности в интерфейсы ваших библиотек и обеспечивать двоичную совместимость с кодом, написанным для более старых версий этих интерфейсов.

Статический метод - это метод, который связан с классом, в котором он определен, а не с каким-либо объектом. Каждый экземпляр класса использует свои статические методы.

Обычно статический метод в интерфейсе используется как методы Помощника, а метод по умолчанию используется как реализация по умолчанию для классов, реализующих этот интерфейс.

Пример:

interface IDemo {

    //this method can be called directly from anywhere this interface is visible
    static int convertStrToInt(String numStr) {
       return Integer.parseInt(numStr);
    }


    //getNum will be implemented in a class
    int getNum();       

    default String numAsStr() {
       //this.getNum will call the class implementation
       return Integer.toString(this.getNum());
    }   

}

Ответ 8

Методы интерфейса по умолчанию:

Это помогает избежать использования вспомогательных классов, так как все методы класса Collections могут быть предоставлены в самих интерфейсах.

Это помогает расширять интерфейсы, не опасаясь нарушения классов реализации.

Статические методы интерфейса:

Они являются частью интерфейса, мы не можем использовать его для объектов класса реализации.

Это помогает в обеспечении безопасности, не позволяя классам реализации переопределять их.

Теперь как статический метод обеспечения безопасности. Давай посмотрим пример.

interface MyInterface {
    /*
     * This is a default method so we need not to implement this method in the implementation classes
     */
    default void newMethod() {
        System.out.println("Newly added default method in Interface");
    }

    /*
     * This is a static method. Static method in interface is similar to default method except that we cannot override them in the implementation classes. Similar to default methods, we need to implement these methods in implementation classes so we can safely add them to the existing interfaces.
     */
    static void anotherNewMethod() {
        System.out.println("Newly added static method in Interface");
    }

    /*
     * Already existing public and abstract method We must need to implement this method in implementation classes.
     */
    void existingMethod(String str);
}

public class Example implements MyInterface {
    // implementing abstract method
    public void existingMethod(String str) {
        System.out.println("String is: " + str);
    }

    public void newMethod() {
        System.out.println("Newly added default method in Class");
    }

    static void anotherNewMethod() {
        System.out.println("Newly added static method in Class");
    }

    public static void main(String[] args) {
        Example obj = new Example();

        // calling the default method of class
        obj.newMethod();
        // calling the static method of class

        obj.anotherNewMethod();

        // calling the static method of interface
        MyInterface.anotherNewMethod();

        // calling the abstract method of interface
        obj.existingMethod("Java 8 is easy to learn");

    }
}

Здесь obj.newMethod(); печать логики реализации класса означает, что мы можем изменить логику этого метода внутри класса реализации.

Но obj.anotherNewMethod(); печать логики реализации класса, но не измененная реализация интерфейса. Поэтому, если какая-либо логика шифрования-дешифрования, написанная внутри этого метода, вы не сможете изменить.

Ответ 9

мы не можем выполнить Interfacesample2.menthod3();, потому что это не статический метод. Для выполнения method3() нам нужен экземпляр интерфейса Interfacesample2.

Найдите следующий практический пример:

public class Java8Tester {
   public static void main(String args[]){
      // Interfacesample2.menthod3(); Cannot make a static reference to the non-static method menthod3 from the type Interfacesample2

      new Interfacesample2(){ }.menthod3();// so in order to call default method we need an instance of interface

       Interfacesample2.method(); // it
   }
}

interface Interfacesample2 {
    public static void method() {
        System.out.println("hello world");
    }

    public default void menthod3() {
        System.out.println("default print");
    }
}

Ответ 10

Запуск интерфейса Java 8 также может иметь статический метод. Как и статический метод класса, статический метод интерфейса можно вызывать с использованием имени интерфейса.

Пример

public interface Calculator {
    int add(int a, int b);
    int subtract(int a, int b);

    default int multiply(int a, int b) {
         throw new RuntimeException("Operation not supported. Upgrade to UltimateCalculator");
    }

    static void display(String value) {
        System.out.println(value);
    }
}

Разница между статическим и интерфейсным методом по умолчанию заключается в том, что метод по умолчанию поддерживает наследование, а статический метод - нет. Метод по умолчанию может быть переопределен в наследующем интерфейсе.

Здесь можно прочитать о методе интерфейса по умолчанию и статическом методе. Метод интерфейса по умолчанию в Java 8