Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Много классов в одном файле


Автор: Reptor 26.7.2007, 13:02
Подскажите как мне в одном файле сделать несколько классов? ведь имя файла должно совпадать с именем класса. 

Автор: math64 26.7.2007, 13:09
Имя одного класса дложно совпадать с именем файла, а другие классы объявить внутри него (вложенные классы). Но class-файлов после компиляции будет столько, сколько было классов.

Автор: Shaggie 26.7.2007, 13:10
Цитата(Reptor @  26.7.2007,  14:02 Найти цитируемый пост)
ведь имя файла должно совпадать с именем класса.  

Это когда класс объявлен как public. Иначе никаких проблем!
Пример файла Server.java
Код

public class Server {

...

}

class ServerThread extends Thread {

...

}


Добавлено через 34 секунды
да, так буден создано несколько .class файлов из одного .java

Автор: Reptor 26.7.2007, 13:18
Цитата

 Но class-файлов после компиляции будет столько, сколько было классов.


Ну в этом ведь нечего страшного нет?

Цитата

Это когда класс объявлен как public.


Тоесть если я зделаю так 
Код


class Panel1 extends JPanel {    
...    
}

class Panel2 extends JPanel {    
...    
}


то я файл могу назвать как угодно?

Автор: LSD 26.7.2007, 14:20
Цитата(Reptor @  26.7.2007,  14:18 Найти цитируемый пост)
то я файл могу назвать как угодно?

Да. Но эти классы будут доступны только внутри твоего package-а.

Автор: chand0s 26.7.2007, 14:27
Цитата(Reptor @  26.7.2007,  14:18 Найти цитируемый пост)
то я файл могу назвать как угодно?

Нет. В файле обязательно должен быть ОДИН public класс, имя которого должно совпадать с именем файла и сколько угодно классов с доступом по-умолчанию, то есть - без модификаторов.

Добавлено @ 14:32
Цитата(LSD @ 26.7.2007,  12:20)

Да. Но эти классы будут доступны только внутри твоего package-а.

Ваша правда.
Сейчас проверил - действительно допускается иметь файл без public класса.
Спасибо.

Автор: math64 26.7.2007, 15:14
В одном java-файле можно разместить несколько обычных классов, но пользоваться этой возможностью не следует (только если выделить пример из форума, вставить в  один файл и откомпилировать). Иначе если удалить все class-файлы и запустить javac *.java, можно получить ошибку компиляции "нет такого класса" при неправильном порядке компиляции.
Эта возможность была введена в java 1.0 когда не было вложенных классов. Теперь нужно использовать вложенные классы,

Автор: Samotnik 27.7.2007, 02:22
Главное, чтобы файл имел такое же имя как класс(где есть Main()), а остальные классы можно называть как угодно

Автор: Platon 27.7.2007, 06:03
Цитата(Samotnik @  27.7.2007,  02:22 Найти цитируемый пост)
Главное, чтобы файл имел такое же имя как класс(где есть Main()), а остальные классы можно называть как угодно

Че-то впервые такую мульку слышу. У меня 99% классов, которые совпадают с именем файла, при этом не имеют мэйна, и ничего. НЕ НАДО вводить в заблуждение.

Автор: math64 27.7.2007, 09:55
Если у вас есть файл A.java и в нём [public] class A и class B. Компилируете. Получаете A.class и B.class. OK.
Пишете class С, использующий B. Компилируете. Компирятор находит class B в В.class. OK.
Добавляете новый метод f() в class B. Вызываете его из class C.
Запускаете class C на компиляцию. Компилатор находит старый B.class, не находит на него нового исходника и выдает ошибку "нет метода f() в классе B".
Если бы class B находился в B.java, компилятор бы его перекомпилировал.
Если [static] class B вложен в класс A, то он компилируется в A$B.class, и компирятор знает, что исходники на него нужно искать в A.java.

Автор: LSD 27.7.2007, 11:47
Классы верхнего уровня могут иметь или модификатор public, или модификатор по умолчанию, внутренние классы могут иметь любой модификатор доступа. Классы верхнего уровня, должны быть объявлены в файле имя которого совпадает с именем класса.
Метод public static void main(String[] args) может содержать любой класс, даже приватный:
Код
public class Outer
{
  private static class Inner
  {
    public static void main(String[] args)
    {
      System.out.println("Hello World!");
    }
  }
}

Автор: Samotnik 27.7.2007, 23:16
Цитата(Platon @  27.7.2007,  06:03 Найти цитируемый пост)
Че-то впервые такую мульку слышу. У меня 99% классов, которые совпадают с именем файла, при этом не имеют мэйна, и ничего. НЕ НАДО вводить в заблуждение.

Прошу прощение, за не допонимание, имелось в виду, что в Java имя исходного файла, должно совпадать с названием класса. 
В Java исходный файл называют единицей компиляции Это текстовый файл, который содержит одно или несколько определений классов. Компилятор требует, чтобы исходный файл использовал расширение .java. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)