Тот же вопрос в коде:
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
}
Существует разница, когда вы подклассифицируете Foo:
public class Bar extends Foo {
}
, а затем пытаетесь использовать другой пакет:
new Bar().getIntProperty ()
Он будет компилироваться во втором из ваших примеров (все методы общедоступны), но не в первом (все методы доступ по умолчанию)
Кстати, это не вычислительный факториал.
Если вы действительно пытаетесь выяснить, куда уходит время, вы можете попробовать stackshots . Я наложил бесконечный цикл на ваш код и забрал 10 из них. Вот код:
6: void forloop(void){
7: int fac=1;
8: int count=5;
9: int i,k;
10:
11: for (i = 1; i <= count; i++){
12: for(k=1;k<=count;k++){
13: fac = fac * i;
14: }
15: }
16: }
17:
18: int main(int argc, char* argv[])
19: {
20: int i;
21: for (;;){
22: forloop();
23: }
24: return 0;
25: }
И вот стопки, переупорядоченные с наиболее частыми наверху:
forloop() line 12
main() line 23
forloop() line 12 + 21 bytes
main() line 23
forloop() line 12 + 21 bytes
main() line 23
forloop() line 12 + 9 bytes
main() line 23
forloop() line 13 + 7 bytes
main() line 23
forloop() line 13 + 3 bytes
main() line 23
forloop() line 6 + 22 bytes
main() line 23
forloop() line 14
main() line 23
forloop() line 7
main() line 23
forloop() line 11 + 9 bytes
main() line 23
Что это вам говорит? В ней говорится, что линия 12 потребляет около 40% времени, а линия 13 - около 20% времени. Это также говорит о том, что линия 23 потребляет почти 100% времени.
Это означает, что разворачивание петли на линии 12 потенциально может дать вам коэффициент ускорения 100/( 100-40) = 100/60 = 1 67x приблизительно. Конечно, есть и другие способы ускорить этот код, такие как устранение внутреннего цикла, если вы действительно пытаетесь вычислить факториал.
Я просто указываю на это, потому что это простой способ профилирования.
-121--3107672-Да и нет.
В приведенном примере нет значимой разницы - по крайней мере, когда речь идет о других классах, обращающихся к методу. Но иногда у тебя...
public interface Bar {
CustomObject getObjectProperty ();
}
И Foo реализует Bar
, и в этом случае требуется public, даже в пределах закрытого пакета Foo.
Из http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html выглядит так, что члены не набора public, в первом примере,не будет видныен подклассам Foo, в то время как набор членов public, во втором примере, будет виден подклассам Foo.
Реализация интерфейсов
Я только могу представить, что ваш класс доступа по умолчанию реализует некоторый интерфейс. Затем вам понадобятся общедоступные методы для его реализации (доступ к вашему классу доступа по умолчанию будет осуществляться вне пакета через интерфейс).
Как любая частная / защищенная / анонимная реализация интерфейса.
Язык Java должен его поддерживать.
Править
Представьте, что вы создаете экземпляр и передаете его классу аутсайдеров (как объект).
Я не уверен в управлении доступом к отражению, но, возможно, класс-посторонний не может получить доступ через отражение (вне пакета) к методам по умолчанию. И если они общедоступны, вы можете.
Да и нет.
В приведенном вами примере нет значимой разницы - по крайней мере, когда дело доходит до других классов, обращающихся к методу. Но иногда у вас есть ...
public interface Bar {
CustomObject getObjectProperty ();
}
И Foo реализует Bar
, и в этом случае общедоступный необходим, даже внутри закрытого пакета Foo.