Есть ли разница между уровнем по умолчанию (пакет) и уровнем общего доступа методов в классе с уровнем доступа по умолчанию (пакет)? - PullRequest
5 голосов
/ 03 февраля 2010

Тот же вопрос в коде:

class Foo {

   int getIntProperty () { ... }

   CustomObject getObjectProperty () { ... }

   void setIntProperty (int i) { ... }

   void setObjectProperty (CustomObject obj) { ... }

   //any other methods with default access level    
}

VS

class Foo {

   public int getIntProperty () { ... }

   public CustomObject getObjectProperty () { ... }

   public void setIntProperty (int i) { ... }

   public void setObjectProperty (CustomObject obj) { ... }

   //any other methods with public access level   
}

Ответы [ 5 ]

5 голосов
/ 03 февраля 2010

Существует разница, когда вы подкласс Foo:

public class Bar extends Foo {

}

затем попробуйте в другом пакете:

new Bar().getIntProperty ()

Он будет компилироваться во втором из ваших примеров (все методы общедоступны), но не при первом (все методы доступа по умолчанию)

2 голосов
/ 03 февраля 2010

С http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html похоже, что члены, не установленные public, в первом примере не будут видны подклассам Foo, в то время как члены set public, во втором примере, будут видны подклассам Foo.

0 голосов
/ 29 сентября 2011

Это пример класса уровня пакета с методом открытого уровня () чтобы гарантировать, что уровень доступа не может быть более ограничительным, чем переопределенный метод.

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

public class A    { public void method() }

class B extends A { public void method() }
0 голосов
/ 03 февраля 2010

Да и нет.

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

public interface Bar {
    CustomObject getObjectProperty ();
}

И Foo implements Bar, в этом случае необходим public, даже внутри пакета Foo.

0 голосов
/ 03 февраля 2010

Реализация интерфейсов

Я могу только представить, что ваш класс доступа по умолчанию реализует некоторый интерфейс.Затем вам понадобятся методы открытого доступа для его реализации (доступ к вашему классу доступа по умолчанию осуществляется через пакет через интерфейс).

Как и любая частная / защищенная / анонимная реализация интерфейса.

Язык Java должен поддерживать его.

Редактировать

Представьте, что вы создаете экземпляр и передаете его через внешний класс (как объект).

Я не уверен насчет управления доступом в отражении, но может быть класс посторонних не может получить доступ через отражение (вне пакета) к методам по умолчанию.И если они публичны, вы можете.

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