Каким должно быть имя файла в котором хранится код java класса solution
Почему с именем класса ArrayApp всё хорошо, а если назвать класс LowArrayApp , то получается ошибка?
Только не надо говорить, что второй класс надо кинуть в другой файл ;)
8. Метод доступа имеет тип void
В стандартных Java-программах очень много классов. Сколько? Тысячи, десятки тысяч. А если еще посчитать, что программа использует различные библиотеки, которые содержат классы, написанные другими программистами, то количество классов легко может исчисляться миллионами!
Для всех этих миллионов, да и просто тысяч классов невозможно придумать уникальные имена.
Нет, ну конечно можно придумать имена типа А123 , Б345 , но если мы говорим о выборе для каждого класса хорошего имени, которое облегчает понимание этого класса (как String для строк, например), то даже тысяча уникальных имен — это большой труд.
Поэтому в Java все классы сгруппированы по пакетам.
Классы и их пакеты в Java по своей сути очень напоминают файлы и папки на компьютере.
Например, если вам нужно хранить на компьютере 10 документов, вы скорее всего просто будете хранить их в одной папке. А если документов тысячи (например, хранилище всех документов компании)?
Если бы нужно было хранить тысячи документов, решением было бы разработать несколько уровней папок с хорошими говорящими названиями. И в папке самого последнего уровня хранить документы, которые относятся к этой конкретной папке. Хорошие говорящие названия для документов тоже не помешают.
Фактически в Java это все и было сделано для классов.
Файлы с классами хранятся в разных директориях (папках), и полное название папки класса со всеми подпапками называется пакетом класса. Пример:
Путь к файлу | Имя пакета | Имя класса |
---|
Имя пакета, в отличие от имени папки, пишется через точку. Т.е. если папка была \com\javarush\tasks\ , ей будет соответствовать пакет com.javarush.tasks .
3. Забыл проинициализировать объекты, являющиеся элементами массива.
В Java массив объектов - это на самом деле массив ссылок на объекты. Создание массива — это просто создание набора ссылок, ни на что не указывающих (то есть равных null). Чтобы на самом деле создать "полноценный" массив объектов, необходимо проинициализировать каждый элемент массива. Многие студенты не понимают этого; они считают, что, создавая массив объектов, они автоматически создают сами объекты. (В большинстве случаев, студенты приносят эту концепцию из C++, где создание массива объектов приводит к созданию самих объектов путем вызова их конструктора по умолчанию). В примере ниже, студент хочет создать 3 объекта класса StringBuffer . Код будет откомпилирован без ошибок, но в последней строке произойдет исключение NullPointerException , где происходит обращение к несуществующему объекту. Ошибочный пример: Чтобы не допускать эту ошибку, необходимо не забывать проинициализировать элементы массива. Исправленный пример:
2. Папка src
В Java принято все классы одной программы хранить в одной папке (и ее подпапках). Такую папку обычно называют src (сокращение от source ).
Такая папка называется корнем проекта ( source root ), и все пути для пакетов считаются от нее. Примеры:
Папки | Имя пакета |
---|
Программисты в такой ситуации скажут что-то типа «у нас есть проект по имени my , который расположен в папке c:\projects\data » или «у нас есть проект по имени project , который расположен в папке d:\files\git\data »
Лучше всегда класть классы в пакеты, а не в корень папки src . Когда классов мало, это ещё не проблема, но когда классов много, очень легко запутаться. Поэтому всегда создавайте классы только в пакетах.
В Java принято давать классам и пакетам осмысленные имена. Многие компании выпускают свои библиотеки (набор классов) и, чтобы не было путаницы, называют пакеты этих классов по имени компании/сайта/проекта:
Имя пакета | Имя компании/проекта |
---|---|
Проект «Apache» | |
Компания «Oracle» | |
Компания Oracle, проект Java | |
Компания «IBM», проект WebSphere | |
Проект «Jboss» |
2. Сравнение с помощью ==
В Java строки — это объекты класса java.lang.String . Оператор == , применяемый к объектам, проверяет на равенство ссылки на объекты! Иногда студенты не понимают семантики оператора == и пытаются применить его для сравнения строк. Ошибочный пример: Правильный способ сравнения 2х строк на равенство — это использование метода equals() класса java.lang.String . Он возвращает true , если строки одинаковой длины и состоят из одних и тех же символов. (Прим. перев.: вообще-то это не гарантирует равенство. На самом деле, equals проверяет, равны ли посимвольно 2 строки) Исправленный пример: Эта ошибка — дурацкая, потому что на самом деле Java код получается синтаксически правильным, а в итоге работает не так как нужно. Некоторые студенты также пытаются применять операторы сравнения > и , вместо метода compareTo() класса java.lang.String . Эту ошибку обнаружить проще, потому что она вызывает ошибки на этапе компиляции.
Вывод
Класс PrintWriter подходит для всех случаев и работает достаточно быстро.
Важно не забывать по окончании работы вызывать у writer 'а метод close() или flush() , чтобы очищать буфер и сбрасывать таким образом несохранённые изменения на диск.
В PrintWriter имеются методы print и println , перегруженные для множества встроенных типов. Есть даже printf с семантикой, похожей на то же самое из языка C, только в Java переменное число аргументов функции (varargs) реализовано через массивы, поэтому этот метод медленный. Зато он полезен, когда необходимо вывести, например, вещественное число с нужной точностью:
Синтаксис написания форматной строки отличается от такового в C, подробности есть в документации.
Также медленно работают вызовы типа println(a + " " + b) . Выводите по одной переменной за раз, и тогда вы добьётесь максимальной эффективности.
В Java есть ещё класс PrintStream , он делает то же самое, что PrintWriter , но работает с byte , а не с char .
4. Импорт классов
Имя класса + имя пакета формируют так называемое полное уникальное имя класса .
Полное уникальное имя | Имя пакета | Имя класса |
---|---|---|
отсутствует |
Хорошая новость:
Полное имя класса всегда уникально в рамках одного проекта. Ну вы же не можете создать два файла с одним и тем же именем в одной и той же папке.
Плохая новость:
Полные имена классов обычно либо длинные, либо очень длинные. А ведь каждый раз писать в коде длинное имя, например java.util.ArrayList, очень неудобно.
Поэтому в Java добавили возможность «импортировать классы».
Вы можете использовать в своем коде короткое имя класса , но сначала вам нужно будет объяснить компилятору, какое именно «полное уникальное имя класса» соответствует короткому имени . Вдруг у вас в проекте несколько классов с таким именем. Или сначала был один, а потом еще 15 добавилось.
Чтобы использовать короткое имя класса в своем коде, вам нужно добавить вот такую конструкцию в свой код:
Добавлять такое объявление нужно в самом начале класса, сразу после объявления package .
Благодаря тому, что мы импортировали два класса java.util.Scanner и com.test.helper.special.ArrayList , мы можем использовать их короткие имена в нашем коде. И компилятор будет знать, какие именно классы использовать.
А вот как бы выглядел этот же код, если бы мы не использовали import :
Кстати, если у вас в проекте есть два класса с именем Scanner , импортировать их оба в один файл с кодом не получится: для второго постоянно придется использовать длинное имя .
Допустим, у вас в коллективе есть Серега, и никаких проблем с общением, не возникает — все знают кто это. Но если бы их было трое, чтобы их различать, пришлось бы использовать полные уникальные имена.
Кстати, если вам лень добавлять много импортов в ваш класс, вы можете воспользоваться его версией для ленивых: вместо имени класса поставить звездочку:
Таким образом, вы сможете использовать в вашем коде короткие имена всех классов из данного пакета.
Все классы из пакета java.lang импортируются автоматически, поэтому вам не нужно писать для них import . Один такой класс вы точно знаете: это класс. java.lang.String . Да, да, тот самый класс String , который используется для работы со строками.
Приведём простейший пример кода (решение задачи A + B):
6. Забыл вызвать конструктор родителя (суперкласса)
Когда класс расширяет другой класс, каждый конструктор подкласса должен вызвать какой либо конструктор суперкласса. Обычно это достигается вызовом конструктора суперкласса методом super(x) , помещенным в первой строке конструктора. Если в первой строке конcтруктора нет вызова super(x) , компилятор самостоятельно вставляет этот вызов, но без параметров: super() . (прим. перев.: х. се, а я и не знал ) Иногда студенты забывают об этом требовании. Обычно это не является проблемой: вызов конструктора суперкласса вставляется компилятором и все работает отлично. Однако если у суперкласса нет конструктора по умолчанию (прим. перев.: то есть конструктора без параметров), то компилятор выдаст ошибку. В примере ниже все конструкторы суперкласса java.io.File имеют 1 или 2 параметра: Ошибочный пример: Решением проблемы является вставка явного вызова правильного конструктора суперкласса: Исправленный пример: Более неприятная ситуация возникает, когда у суперкласса есть конструктор по умолчанию, но он не полностью инициализирует объект. В таком случае код скомпилируется, но результат работы программы может быть неправильным или может возникнуть исключение.
Ввод и вывод данных
Как правило, для ввода используют один из четырёх способов, которые различаются по скорости и удобству использования. Ввод/вывод в Java может стать очень медленным, если пользоваться им неправильно.
Scanner
Класс Scanner является самым удобным средством для чтения входных данных в большинстве задач, но скорость его работы оставляет желать лучшего. Имеет много методов для чтения примитивных типов, длинных чисел, строки до разделителя, строки до переноса, строки по регулярному выражению и т. д. Все это богатство основывается на регулярных выражениях, поэтому работает медленно. Когда размер входного файла примерно мегабайт, с помощью сканера его удастся прочитать примерно за полсекунды-секунду. Поэтому, прежде чем использовать сканер, убедитесь, что размер входного файла небольшой. Подводные камни: конструктор Scanner(String) читает данные из строки, а не из файла, который так назван.
Пример чтения всех целых чисел из файла input.txt (до конца файла):
BufferedReader
Обеспечивает достаточно быстрый ввод для большинства задач. Но самостоятельно этот класс позволяет лишь читать отдельные символы и строки.
Пример чтения чисел из файла input.txt , где каждое число записано в отдельной строке, после последнего может следовать, а может и не следовать перевод строки, но пустые строки недопустимы:
StreamTokenizer + BufferedReader
Класс, изначально предназначенный для токенизации исходных текстов на Java. По этой причине имеет слегка запутанный интерфейс и кучу нетривиальных настроек. Работает быстро, но имеет некоторые подводные камни:
- Если вы настраиваете его на чтение чисел, все они хранятся в double после прочтения. Это очень плохо, когда среди входных данных попадаются long 'и (64-битные числа): они теряют точность, если их хранить в double .
- В одном из своих режимов автоматически распознает backslash escape-последовательности. То есть \n во входном файле превращается в один символ перевода строки. При решении задач такое поведение может только мешать.
Также стоит отметить, что этот способ требует в несколько раз меньше памяти для создания промежуточных объектов, чем остальные.
Резюме по StreamTokenizer : его имеет смысл использовать в задачах на парсинг. В таких задачах решения получаются существенно короче.
Пример чтения всех целых чисел из файла input.txt (до конца файла):
StringTokenizer + BufferedReader
Довольно простая по смыслу комбинация: из файла читаем по строкам, далее строку бьём на токены. В итоге получается метод String next() , который читает «следующий токен», поверх которого делаются int nextInt() , long nextLong() , double nextDouble() через соответственно Integer.parseInt , Long.parseLong , Double.parseDouble . Все это работает почти так же быстро, как StreamTokenizer , за вычетом того, что строк создается побольше. Тем не менее, файлы порядка десяти мегабайт читаются на ура.
По сравнению с другими перечисленными выше способами для этого нужно больше всего кода. Однако код можно написать один раз и использовать в нескольких задачах.
Подводные камни: когда файл кончается, метод readLine класса BufferedReader возвращает null . Если в задаче нужно читать данные до конца файла, нужно предусмотреть корректный путь этого null в написанных методах.
Приведём расширенный пример написания обёртки над StringTokenizer для чтения всех чисел из файла. Числа могут быть записаны по несколько в строке, возможны пустые строки и т. д.
3 ответа 3
Я скомпилировал программой javac ваш код.
Код выполняется без проблем :
В результате получается два файла LowArray.class и LowArrayApp.class
Код выполняется без проблем :
В результате получается два файла LowArray.class и ArrayApp.class
Кстати. все кто писал про неправильное имя файла с исходником, о том что его имя должно совпадать с именем класса, у которого объявлен метод main.
Ребята, вы ошибаетесь! Это условие действует только когда класс имеет модификатор доступа public. Здесь же в коде модификаторы доступа не указаны и имя файла может быть любым.
и после компиляции одного .java файла будет получено два .class файла.
А Вы название файла с этим классом меняли? Файл с классом, содержащим метод main, должен иметь то же имя, что и этот класс.
Очень странно, только сейчас попробовал у себя дать классу такое имя - и без проблем все прошло. Что компилятор пишет?
исходя из того что вы предоставили на обозрение сложно предположить что вы пытаетесь сделать, поэтому позволю себе повторить общеизвестную информацию.
пример:
вам нужно использовать какое-то сложное логгирование. вы реализовали общий функционал и инициализацию в классе BaseLogger, и в то же время предоставляете возможность использовать его базовую реализацию:
нет смысла классу DefaultLogger давать модификатор public, так как он не будет никем наследоватся и вообще где-то использоватся кроме класса BaseLogger. он нужен лишь для того чтоб потом не надо было вкручивать еще один отдельный класс для "дефолтного" логгера. так как он не public и используется в пределах класса BaseLogger, то нет смысла хранить его в отдельном файле.
в java public class всегда хранится в отдельном файле, имя которого совпадает с его именем (без имени пакета). package private классы (без модификатора public) можно хранить как в отдельных файлах (если они используются многими классами пакета) так и в одном файле в как в примере.
4. Помещение в один файл сразу нескольких классов с модификатором public
7. Неправильный перехват исключений
Локализация
Использование свойства ONLINE_JUDGE
Запуск программы на сервере осуществляется с определенным свойством ONLINE_JUDGE . С его помощью в коде программы можно определить, что она запущена на сервере. Например, это можно использовать для решения, использовать ли для работы файлы или стандартный ввод/вывод:
Вот эти две строчки выводят на экран класс System и его пакет. Подскажите метод, который выводит текущий класс и пакет.
Если можно подробно.
Вывести на экран текст: полное имя файла java.exe из установленного пакета java
Я тока недавно начал учить этот язык. Подскажите как это делается или приведите код к примеру. .
Как в Java ME вывести на экран текущее время?
Пробовал через класс DateField, но там нужно выставлять самому дату и время, а мне нужно что-бы он.
Вывести на экран имя класса
Можно как нибуть форматнуть в string имя класса? class HelloWorld < public: string s;.
Возможно ли как-то, зная имя класса, вернуть в каком-либо методе имя класса?
Добрый день! Интересуюсь. Есть Обобщенный метод, например: Add<T>(string nameElement). .
есть подозрение что подобную информацию можно получить только от объекта
Вывод: Name of the current class:class javax.swing.JButton
server, для JButton нужен импорт javax.swing.JButton
Вывести на экран название текущего месяца и текущее время
Никак не могу разобраться((( помогите, пожалуйста declare @d datetime declare @dd char='15'.
Создайте командный файл, который спрашивает: «Вы хотите узнать текущее время или текущую дату?» – и в зависимости от ответа выдает на экран текущее вр
Здраствуйте очень сильно нужна помощь в написании батников кто может помогите пожалуйста. 1.
Вывести на экран текущее время + день + месяц в Visual Studio 2012
Подскажите пожалуйста как вывести на экран текущее время + день + месяц Язык Си, среда VS 2012 .
Как я могу вывести имя класса в котором я нахожусь (на данный момент выполняется программа)?
как я могу вывести имя класса в котором я нахожусь (на данный момент выполняется программа)? а.
java.exe -classpath имя класса - не выполняет класс.
Почему java.exe может не выполнять классы.Пишу java.exe -classpath имя класса, а она не хочет.
Как вывести информацию из класса на экран
Разработать класс Абитуриент (ФИО, класс, средний балл). Включить в класс указанные поля, сделав их.
1. Имя класса отличается от имени файла, в котором он хранится
Все используемые мною среды java, включая Javasoft JDKs, предполагают, что исходный код класса с модификатором public хранится в файле с точно таким же именем, как и имя класса, и расширением .java. Несоблюдение этого соглашения может стать причиной многих проблем, которые выявятся во время компиляции.
Начинающие студенты (программисты) часто забывают об этом соглашении, и, например, задают имя файла в соответствии с заданием: Lab6.java. Ошибочный пример: Имя файла Lab6.java Исправленный пример: Имя файла Airplane.java Заметьте: предполагается, что имя класса начинается с заглавной буквы. В операционных системах, которые учитывают регистр символов в именах файлов, могут появиться дополнительные проблемы, особенно у студентов, изучающих Java под Unix, и привыкших к системеm именования файлов в DOS. Класс MotorVehicle должен храниться в файле MotorVehicle.java , но не в файле motorvehicle.java .
5. Подмена поля класса локальной переменной.
немного сумбурно, но смысл такой
то есть в конструкторе все смотрится красиво, но для обычных методов применять это не следует.
Общие замечания
- Решение должно содержаться в одном файле с расширением java.
- Код должен находиться в пакете по умолчанию, т. е. не следует использовать директиву package . Если это требование не выполнено, то решение успешно компилируется, но падает на всех тестах с вердиктом «Ошибка во время выполнения» (дело в том, что Java-машина не может загрузить класс).
- В файле должен находиться единственный public-класс, имя которого совпадает с именем файла решения (например, если файл с исходником называется Solution.java, то класс будет называться Solution ). Public-класс должен содержать статический метод main . Разумеется, допускается использование вложенных классов.
- Если в решении задачи используется глубокая рекурсия, может произойти переполнение системного стека. (В некоторых случаях java-машина странным образом использует программный стек, и «глубокой» может стать рекурсия глубиной меньше тысячи вызовов.) Возникнет ошибка StackOverflowError , и если она специально не обрабатывается (а такие ошибки, которые наследуются от класса Error , вообще не принято обрабатывать в пользовательском коде), программа аварийно завершается. Выходом может стать увеличение размера стека. Как известно, у каждого потока в программе стек свой. Java позволяет создать новый поток и в конструкторе класса Thread задать желаемый размер стека, а затем весь код решения выполнять в новом потоке. Сигнатура конструктора выглядит следующим образом:
Пример использования (устанавливаем размер стека в 64 МБ):
К сожалению, документация гласит, что в общем случае эффект от параметра stackSize зависит от реализации конкретной виртуальной машины JVM и носит скорее рекомендательный характер. На некоторых платформах указание большего значения stackSize позволит достичь большей глубины рекурсии до возникновения ошибки StackOverflowError . Аналогично, указание меньшего значения может позволить большему числу потоков существовать одновременно до появления другой ошибки — OutOfMemoryError (или какой-то ещё). Детали соотношения между значением параметра stackSize и максимальной глубиной рекурсии являются платформозависимыми. На некоторых платформах параметр, задающий размер стека, может вовсе игнорироваться или округляться в любую сторону.
Стоит отметить, что аварийное завершение второго потока в результате любой ошибки во время выполнения, вообще говоря, не приводит к вердикту Run-time Error, поскольку основной поток завершается успешно. В результате возникновения подобной ошибки следует ожидать вердикт Wrong Answer или же Presentation Error.
3. Содержимое файла
Согласно стандарту языка Java, внутри файла с кодом должна быть записана информация об имени класса и имя его пакета. Схема стандарта приведена ниже:
Имя пакета должно совпадать с именем папки, а имя файла — с именем публичного класса.
Если у вас есть файл . \src\ com\project \ Service .java , значит у него внутри должно быть записано:
Читайте также: