Почему у нас нет пользовательских комментариев в методах интерфейса? [Дубликат]

  // #define _WIN32_WINNT 0x0500 // windows & gt; = 2000 #include & lt; windows.h & gt;  #include & lt; iostream & gt;  использование пространства имен std;  void pos (короткий C, короткий R) {COORD xy;  xy.X = C;  xy.Y = R;  SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), xy);  } void cls () {pos (0,0);  для (int j = 0; j & lt; 100; j ++) cout & lt;  строка (100, '');  поз (0,0);  } int main (void) {// писать somthing и ждать (int j = 0; j & lt; 100; j ++) cout & lt; & lt;  строка (10, 'a');  cout & lt;  "\n \nпрессовать любую клавишу в cls ...";  cin.get ();  // очищаем экран cls ();  return 0;  }  
60
задан 28 March 2014 в 18:09
поделиться

3 ответа

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

  • Статический метод - это метод, который связан с классом, в котором он определен, а не с каким-либо объектом. Каждый экземпляр класса использует свои статические методы.
  • Это упрощает организацию вспомогательных методов в ваших библиотеках; вы можете хранить статические методы, специфичные для интерфейса в одном и том же интерфейсе, а не в отдельном классе.
  • В следующем примере определяется статический метод, который извлекает объект ZoneId, соответствующий идентификатору часового пояса; он использует часовой пояс системы по умолчанию, если нет объекта ZoneId, соответствующего данному идентификатору. (В результате вы можете упростить метод getZonedDateTime)

Вот код:

public interface TimeClient {
   // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +"; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

   default public ZonedDateTime getZonedDateTime(String zoneString) {
      return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
   }    
}

См. Также

83
ответ дан Aniket Kulkarni 17 August 2018 в 13:38
поделиться
  • 1
    Также используются по умолчанию методы. – Ian McLaird 28 March 2014 в 15:07
  • 2
    Я не использую java 8. Это javac 1.7.0_25. – user 28 March 2014 в 15:07
  • 3
    Является ли ваша среда IDE кодом 8? Это должно не скомпилировать с 7 и ниже. Вот хорошая статья . – Giovanni Botta 28 March 2014 в 15:10
  • 4
    В соответствии со статьей проверьте новые методы, добавленные в интерфейс Comparator в Java 8. – Giovanni Botta 28 March 2014 в 15:13
  • 5
    @Phoenix Я также использую версию 1.7.0_25, но в этой версии она не допускается – Shekhar Khairnar 28 March 2014 в 15:15

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

Пример:

interface I1{
    public void doSmth();

    class DefaultRealizationClass implements  I1{

        @Override
        public void doSmth() {
           System.out.println("default realization");
        }
    }
}

Как мы используем его в нашем коде?

class MyClass implements I1{

    @Override
    public void doSmth() {
         new I1.DefaultRealizationClass().doSmth();
    }   
}

Поэтому реализация по умолчанию инкапсулирована внутри интерфейса.

13
ответ дан gstackoverflow 17 August 2018 в 13:38
поделиться

Это возможно только в Java 8. В Спецификация языка Java 7 §9.4 он явно указывает:

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

Таким образом, в Java 7 статические методы в интерфейсах не могут существовать .

Если вы перейдете к Спецификации языка Java 8 §9.4.3 , вы увидите, что он говорит:

Статический метод также имеет тело блока, который обеспечивает реализацию метода.

Таким образом, он явно заявляет, что в Java 8 они могут существовать .

Я даже пытался запустите ваш точный код в Java 1.7.0_45, но он дал мне ошибку «модификатор static не разрешен здесь».


Вот цитата прямо из Java 8 Методы по умолчанию (Изучение языка Java> Интерфейсы и наследование) :

Статические методы

В additi по умолчанию, вы можете определить статические методы в интерфейсах. (Статический метод - это метод, который связан с классом, в котором он определен, а не с каким-либо объектом. Каждый экземпляр класса использует свои статические методы.) Это упрощает организацию вспомогательных методов в ваших библиотеках; вы можете сохранять статические методы, специфичные для интерфейса в одном и том же интерфейсе, а не в отдельном классе. В следующем примере определяется статический метод, который извлекает объект ZoneId , соответствующий идентификатору часового пояса; он использует часовой пояс системы по умолчанию, если нет объекта ZoneId, соответствующего данному идентификатору. (В результате вы можете упростить метод getZonedDateTime):

public interface TimeClient {
    // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

    default public ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }    
}

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

18
ответ дан The Guy with The Hat 17 August 2018 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: