переменные интерфейса являются окончательными и статическими по умолчанию, а методы являются публичными и абстрактными - PullRequest
4 голосов
/ 14 апреля 2010

Вопрос в том, почему по умолчанию решено иметь переменную final и static, а методы - public и abstract.

Есть ли какая-то конкретная причина для того, чтобы сделать их неявными, переменными как окончательными и статическими, так и методами как публичными и абстрактными.

Почему они не разрешают статический метод, но допускают статическую переменную?

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

В следующей программе оба интерфейса имеют метод с одним и тем же именем ... но при реализации только одного, который мы реализуем ... Так ли решается проблема с алмазом?

interface testInt {
    int m = 0;
    void testMethod();
}

interface testInt1 {
    int m = 10;
    void testMethod();
}

public class interfaceCheck implements testInt, testInt1{
        public void testMethod() {
            System . out . println ( "m is"+ testInt.m );   
             System . out . println ( "Hi World!" );    
        }
}

Ответы [ 3 ]

5 голосов
/ 14 апреля 2010

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

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

2 голосов
/ 14 апреля 2010

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

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

У Java нет проблем с бриллиантами, поскольку интерфейсы не содержат код. Если вашему интерфейсу разрешено иметь код, то Java не сможет определить, должен ли он вызывать testMethod () testInt или testMethod () testInt1. Поскольку интерфейсы не имеют кода, Java знает, что существует только 1 реализация testMethod с кодом, который необходимо запустить.

0 голосов
/ 14 апреля 2010

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

Как следует из названия, интерфейс - это просто определение операций, доступных в экземпляре, поэтому он не содержит никакой реализации метода.

По этим причинам не имеет смысла разрешать методы не быть публичными, а переменные не быть статичными.

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

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