Каково значение между наличием класса Java, содержащего основной метод настройки как открытый, а не - PullRequest
0 голосов
/ 25 июня 2010

Когда я начал изучать Java, я тоже начал с вездесущего приложения Hello world.Что более или менее похоже на:

public class MyClass {

 public static void main(String args[]){

    //some code here....

 }

}

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

После просмотра ее кода первое, что я заметил, было отсутствие спецификатора открытого доступа к классу с методом main.Я тут же высмеял ее, и начал «исправлять», добавив модификатор публичного доступа.Эта шутка была для меня чужой, поскольку это тоже не имело никакого значения.Затем я понял, что она пытается выполнить скомпилированный класс из каталога, отличного от того, где находится файл класса.Я перешел на этот каталог и дал команду java, и она сразу же запустилась.

Это подводит меня к моему вопросу ... В большинстве примеров "Здравствуй, мир!" Есть настройка класса с публичным доступом, когда вполне возможно, что такого вообще нет.Так какая разница, если вообще для класса, который содержит метод main?

Чтобы прояснить, что именно мы делаем, выполните следующие шаги:

У нас был класс в

c:\users\[usersname]\[my documents folder]\myprog.class

, и мы попытались запустить его изc: \ (как наш рабочий каталог).Мы указали полный относительный путь, ожидая, что он будет работать.вот так:

java users\[usersname]\[my documents folder]\myprog

Конечно, это просто не получалось, пока я не перешел в папку документов, сделав ее текущим рабочим каталогом, и снова ввел команду примерно так

java myprog

Так что в основном такой вызовимеет смысл, когда у вас есть класс в пакете, напоминающий структуру папок, добавленный к его имени.В этом случае класс отсутствует в любой упаковке.

Ответы [ 5 ]

5 голосов
/ 25 июня 2010

Спецификатор "public" против "package" имеет отношение к тому, разрешено ли классам в других пакетах "видеть" класс.

Большинство программ hello world игнорируют пакеты, поэтому они используют более распространенную публичную опцию.Большинству людей никогда не нужно узнавать о других спецификаторах пакетов (и их ограничениях), пока они не научатся организовывать свой проект в пакеты.Конечно, если у вас есть только один класс, это тоже не имеет значения.

Кроме того, я не уверен, почему вы издеваетесь над начинающими программистами.Я занимаюсь программированием на Java уже 10 лет и все еще учусь чему-то новому.

1 голос
/ 25 июня 2010

Итак, какая разница, если вообще для класса, содержащего метод main?

Нет!

Вы можете успешно запустить метод main класса с модификатором открытого доступа или без него.

Ваша проблема заключалась в том, что класс находился в другом каталоге, поэтому интерпретатор (java) не знал, где на что посмотреть.

Допустим, у меня есть: src/Hello.java

И вы компилируете это с помощью: javac src/Hello.java

Он компилируется нормально, а затем вы пытаетесь выполнить его: java Hello

но это не будет работать, не потому, что классИмеет открытый доступ или нет, но поскольку сгенерированный файл .class находится внутри каталога src, а не здесь (.)

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

См. Этот пример:

$mkdir src 
$cat >src/Hello.java <<.
> class Hello {
>     public static void main( String [] args ) {
>         System.out.println("Hello, world");
>     }
> }
> .
$javac src/Hello.java 
$java Hello 
Exception in thread "main" java.lang.NoClassDefFoundError: Hello
Caused by: java.lang.ClassNotFoundException: Hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
$cd src/
$java Hello 
Hello, world
$cd ..
$ls
src
$rm src/Hello.class 
$javac -d . src/Hello.java 
$java Hello 
Hello, world
$
1 голос
/ 25 июня 2010

Как и любой метод, на карту поставлена ​​видимость для других классов.Ваш основной метод будет доступен для других классов, если вы отметите его как открытый.

0 голосов
/ 25 июня 2010

Модификатор видимости (общедоступный, закрытый или защищенный) на самом деле не является обязательным.

Если вы не укажете модификатор видимости, применяется видимость по умолчанию.

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

0 голосов
/ 25 июня 2010

Неужели это не обязательно? Интересно, я должен сказать, что я не пробовал это.

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

Независимо от того, строго ли необходимо обнародовать основной класс, не имеет никакого концептуального смысла делать иначе. Более узкие определения доступа могут восприниматься как признаки того, что этот класс не будет доступен для внешних аспектов, поэтому вы можете изменить определение по своему усмотрению. В этом контексте ваш основной класс определенно является public, и поэтому я бы сказал, что было бы неправильно (даже если это законно) определять его как что-либо еще.

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