2013-03-24 3 views
1

Этот вопрос относится к тому, где классы сами (а не их методы или данные) должны быть объявлены публичными.Когда «общедоступно» необходимо в определении класса?

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

Итак, сегодня я решил попробовать что-то новое и поместить классы в отдельные файлы. Меня удивило то, что когда я помещал класс в отдельный файл, этот класс был доступен для основной программы, даже если он не был помечен как «общедоступный».

Ради определенного примера, скажем, у меня есть всего два файла в одной папке. Файл «mainprog.java», содержащий следующее:

class mainprog { 
    public static void main(String[] args) { 
     hello myHello = new hello(); 
     myHello.sayHello(); 
    } 
} 

И файл «hello.java» не содержащий следующее:

class hello { 
    void sayHello() { 
    System.out.println("Hello world"); 
    } 
} 

Ничто в «привет» определяется как общественности, но это компилируется и работает просто отлично с

javac mainprog.java 
java mainprog 

Так что я просто удивляюсь, где «общедоступные» действительно необходимы для определения классов?

EDIT для добавления новой информации По предложению ответов ниже, я попытался добавить «пакет» заявление каждый файл, таким образом, чтобы сделать их из разных пакетов. Как и ожидалось, доступ к классу «привет» был тогда отказано, если я не сделал как класс «привет», и это метод «SayHello() общественности. Спасибо всем.

+1

Публичные классы видны * за пределами упаковки * они объявлены в –

+2

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html –

ответ

1

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

Если один класс проживали за пределами пакета, или другой класс из другого пакета необходим доступ к тем, он не будет доступен.

Here's a reference to Oracle's visibility of methods/classes/fields.

+0

Спасибо. Вероятно, я должен добавить в вопрос, что я не знаю, что такое пакет, или что указывает, являются ли файлы частью пакета или нет. Так ли это просто (в данном случае), как будто все файлы находятся в одной и той же ** папке **, тогда они считаются частью одного и того же пакета (даже если форматы не определены)? – Stuart

+1

Да, это правильно. Если пакеты не определены, то считается, что они находятся в пакете по умолчанию. – Makoto

+0

Спасибо Макото, это ответ на мой вопрос. Да, я нашел это в googled и обнаружил, что публика должна была отображать класс за пределами текущего пакета. Просто я знал, что не определил никаких пакетов, так что было удивлено, что он работал без «публичного» спецификатора. Вы очистили мое недоразумение. Благодарю. – Stuart

1

УпаковкаОпределение

Пакет Java - это механизм для размещения классов Java в пространствах имен, подобных модулям Modula. Пакеты Java могут храниться в сжатых файлах, называемых JAR-файлами, что позволяет классам загружаться быстрее, чем группа, а не по одному. Программисты также обычно используют пакеты для организации классов, принадлежащих к той же категории, или обеспечения аналогичной функциональности.

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

Использование общественного класса.

Если вы хотите сделать объект этот класс из другого пакета.

Предположим, у вас есть один класс в демо-пакете.

Demo package. 
    Demo.java 

Оба класса находятся в разных упаковках.

Demo1 package 
    Demo1.java 

Теперь вы хотите создать объект класса Demo.java в Demo1.java, которые находятся в другом пакете, то вам необходимо определить Демонстрационный класса общественности.

Прочитано docs.

+0

Спасибо TGMCians. Я еще не определился с пакетами. Я знал о их существовании, но еще не посмотрел, как они определены или что-то еще. Похоже, мне нужно будет сделать следующее, чтобы учиться. :) – Stuart

1

По умолчанию все классы под одним и тем же пакетом [или папкой] имеют модификатор доступа «protected». Таким образом, вы можете получить доступ к классу без каких-либо проблем. Обратитесь к концепции «Наследование», и у вас будет лучшее представление о модификаторах доступа. Приветствия!

Смежные вопросы