почему есть открытые методы в классе Object в Java? - PullRequest
5 голосов
/ 15 августа 2010

Когда мы знаем, что в java все классы по умолчанию расширяют класс Object, так почему существуют методы с открытым модификатором, где в качестве защищенного было бы достаточно доступа этих методов из любого класса?Так что нужна информация об этом.спасибо.

Ответы [ 4 ]

11 голосов
/ 15 августа 2010

Если методы Object не были общедоступными (или находились в пределах пакета), вы не могли бы вызывать их извне дочернего объекта.Тот факт, что они наследуются всеми объектами Java, ортогонален области действия этих методов.

Быстрый пример: как часто вы вызываете x.toString()?Вы не могли бы сделать это, если бы этот метод не был публичным.И если бы этот метод вообще не существовал в Object, вам бы пришлось его заново реализовать для каждого нового класса.

1 голос
/ 15 августа 2010

как защищенный будет достаточен доступ к этим методам из любого класса

Из любого класса, да, но не для любого Object:

Язык JavaSpec определяет значение protected следующим образом:

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

То есть подкласс S может вызывать защищенные конструкторы / члены суперкласса C только в случаях S.

1 голос
/ 15 августа 2010

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

Итак, пока этот код компилируется:

public class Test {
    private int x;

    private void change(Test test) {
        test.x = test.x + 1;
    }

    public static void main() {
        Test test1 = new Test();
        Test test2 = new Test();
        test1.change(test2);
    }
}

Следующий код не скомпилируется:

public class Test2 {
    public static void main() {
         Test1 test1 = new Test1();
         test1.clone();   // The method clone() from the type Object is not visible
    }
}

Возможность звонить toString(), equals(Object), hashCode() и getClass() on all objects makes things a lot easier.</p> <p><code>clone() и finalize() защищены. Таким образом, чтобы иметь возможность вызывать их извне, подкласс должен увеличить видимость. И это, очевидно, проектное решение.

Если честно, я понятия не имею, почему Sun решила, что все объекты являются "замками" и имеют notify(), notifyAll(), wait(long), wait (long, int) . С моей точки зрения, этот метод вообще не должен быть в Object, а в специализированном Lock-классе. Но я думаю, что была хорошая причина иметь их там в самые первые дни, и это нельзя изменить в наше время без нарушения совместимости.

1 голос
/ 15 августа 2010

clone() - это защищенный метод для объекта, и вы не можете вызвать clone() для экземпляров других классов.

...