Java: руководство для начинающих (ЛП)
Java: руководство для начинающих (ЛП) читать книгу онлайн
"Java: руководство для начинающих"составлено Гербертом Шилдтом, автором популярных во всем мире книг по языкам программирования, таким образом, чтобы читатель смог быстро овладеть основными навыками программирования на Java. Полностью обновленное по версии Java Platform, Standard Edition 7, пятое издание этого учебного пособия начинается с рассмотрения самых основ, включая компилирование и выполнение простых программ на Java. Затем в нем описываются ключевые слова и синтаксические конструкции, составляющие основу Java как языка программирования. Далее следует изложение самых передовых языковых средств Java, включая обобщения и многопоточное программирование. И завершается книга введением в библиотеку Swing. Представленный в книге учебный и справочный материал позволяет легко и быстро научиться программировать на Java. Для облегчения процесса изучения Java книга построена следующим образом: - Основные навыки и понятия. Каждая глава начинается с перечня основных навыков и понятий, которые предстоит усвоить читателю. - Обращение к знатоку. Во врезках под этим заголовком даются полезные рекомендации в форме вопросов и ответов. - Примеры для опробования. Это примеры небольших проектов, наглядно показывающие, как применять приобретенные знания и навыки на практике. - Упражнения для самопроверки. В конце каждой главы приводятся контрольные вопросы и задания для проверки прочности усвоенного материала. - Подробные комментарии к примерам программ. Все примеры программ в этой книге снабжены подробными комментариями, описывающими демонстрируемые языковые средства и приемы программирования на Java. В этом учебном пособии для начинающих программировать на Java подробно рассмотрены все основные средства данного языка программирования: типы данных, операторы, циклы, классы, интерфейсы, методы, исключения, обобщения, пакеты, основные библиотеки классов, средства многопоточного программирования, потоки ввода-вывода, перечисления, апплеты и документирующие комментарии. Применение всех этих языковых средств Java на практике наглядно демонстрируется в небольших проектах для самостоятельного опробования. Книга снабжена массой полезных советов авторитетного автора и множеством примеров программ с подробными комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. А для проверки прочности приобретенных знаний и навыков в конце каждой главы приводятся контрольные вопросы и задания.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Иногда оказываются полезными методы, способные принимать переменное число аргументов. Например, методу, устанавливающему соединение с Интернетом, могут понадобиться имя и пароль пользователя, имя файла, протокол и другие параметры. Если при вызове метода какие-нибудь из этих данных не указаны, то должны использоваться значения по умолчанию. В таком случае было бы уместнее передавать только те аргументы, для которых не предусмотрены значения по умолчанию. А для этого требуется метод, поддерживающий список аргументов переменной, не фиксированной длины.
Раньше для поддержки переменного числа аргументов применялись два способа, причем оба были далеки от совершенства. Первый способ состоял в следующем: если максимальное число аргументов невелико и известно заранее, то можно создать разные варианты одного метода. Очевидно, что такой подход применим лишь в отдельных случаях. Если же значений оказывалось слишком много или их максимальное количество не было известно заранее, то применялся второй способ: параметры помещались в массив, который и передавался методу. Обоим этим способам присущи определенные недостатки, и со временем стало ясно, что требуется какой-то другой, более совершенный подход к решению данной задачи.
В версии JDK 5 появились языковые средства Java, упрощающие создание методов, которым требуется переменное число аргументов. Эти средства называются аргументами переменной длины, а метод, принимающий переменное число аргументов,— методом переменной арности, или же методом с аргументами переменной длины. Список параметров, соответствующих аргументам переменной длины, имеет не фиксированную, а переменную длину. Поэтому метод с аргументами переменной длины может принимать произвольно изменяющееся число аргументов.Общие положения об аргументах переменной длины
Для указания на то, что метод может принимать переменное число аргументов, в его объявление включается многоточие (...)• Ниже приведен пример метода vaTest (), принимающего переменное число аргументов.// Метод vaTest() с аргументами переменной длины.// Объявление списка аргументов переменной длины.static void vaTest(int ... v) { System.out.println("Number of args: " + v.length); System.out.println("Contents: "); for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println();}
Обратите внимание на следующий синтаксис объявления аргумента v:int ... v
Этот синтаксис сообщает компилятору, что метод vaTest () может вызываться с указанием произвольного числа аргументов, в том числе и совсем без них. Более того, аргумент v неявно объявляется как массив типа int [ ]. А в теле метода vaTest () доступ к аргументу v осуществляется с помощью обычного синтаксиса обращения к массивам.
Ниже приведен весь исходный код примера программы, демонстрирующего метод vaTest () в действии.// Демонстрация метода с аргументами переменной длины,class VarArgs { // Метод vaTest() с аргументами переменной длины, static void vaTest(int ... v) { System.out.println("Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println(); } public static void main(String args[]) { // Метод vaTest() может вызываться с переменным числом аргументов. vaTest(10); // 1 аргумент vaTest(l, 2, 3); // 3 аргумента vaTest(); // без аргументов }}
Выполнение этой программы дает следующий результат:Number of args: 1Contents:arg 0: 10Number of args: 3Contents:arg 0: 1arg 1: 2arg 2: 3Number of args: 0Contents:
В приведенной выше программе обращает на себя внимание следующее. Во-первых, как пояснялось выше, обращение к аргументу v в методе vaTest () осуществляется как к массиву. Дело в том, что он действительно является массивом. Многоточие в объявлении этого метода указывает компилятору на использование переменного числа аргументов и на необходимость поместить их в массив v. Во-вторых, при обращении к методу vaTest () в методе main () указывается разное число аргументов, включая и вызов данного метода вообще без аргументов. Указываемые аргументы автоматически помещаются в массив v. Если же аргументы не указаны, длина этого массива будет равна нулю.
Помимо аргумента переменной длины, в методе можно также указывать и обычные аргументы, но при одном условии: аргумент переменной длины должен быть указан последним. Например, приведенное ниже объявление метода является вполне допустимым,int dolt(int a, int b, double с, int ... vals) {
В данном случае первые три аргумента, передаваемые при вызове метода dolt (), будут соответствовать первым трем параметрам. А остальные аргументы будут считаться относящимися к параметру переменной длины vals.
Ниже приведен переработанный вариант метода vaTest (), в котором используются как обычные аргументы, так и аргументы переменной длины.// Использование аргументов переменной длины// вместе с обычными аргументами,class VarArgs2 { // Здесь msg - обычный аргумент, // a v - аргумент переменной длины. static void vaTest(String msg, int ... v) { System.out.println(msg + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println(); } public static void main(String args[]) { vaTest("One vararg: ", 10); vaTest ("Three varargs: ", 1, 2, 3); vaTest("No varargs: "); }}
Выполнение этого фрагмента кода дает следующий результат:One vararg: 1Contents:arg 0: 10Three varargs: 3Contents:arg 0: 1arg 1: 2arg 2: 3No varargs: 0Contents:
He следует, однако, забывать, что аргумент переменной длины должен быть указан последним. Например, следующее объявление метода недопустимо:int dolt(int a, int b, double с, int ... vals,boolean stopFlag) { // Ошибка!
В данном примере сделана попытка указать обычный аргумент после аргумента переменной длины.
Существует еще одно ограничение, которое следует соблюдать: аргументы переменной длины можно указать в методе только один раз. Например, приведенное ниже объявление метода составлено неверно.int dolt(int a, int b, double с, int ... vals,double ... morevals) { // Ошибка!
Ошибкой в данном случае является попытка указать два разных типа аргументов переменной длины.Перегрузка методов с аргументами переменной длины
Если требуется, то метод, принимающий переменное число аргументов, можно перегрузить. Например, в следующей программе трижды перегружается метод vaTest ():// Перегрузка метода с аргументами переменной длины,class VarArgs3 { // Первый вариант метода vaTest(). static void vaTest(int ... v) { System.out.println("vaTest (int ...): " + "Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println(); } // Второй вариант метода vaTest(). static void vaTest(boolean ... v) { System.out.println("vaTest(boolean ...): " + "Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println(); } // Третий вариант метода vaTest(). static void vaTest(String msg, int ... v) { System.out.println("vaTest(String, int ...): " + msg + v.length); System.out.println("Contents: ") ; for (int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println(); } public static void main(String args[]) { vaTest(1, 2, 3) ; vaTest("Testing: ", 10, 20); vaTest(true, false, false); }}
Выполнение этой программы дает следующий результат:vaTest(int ...): Number of args: 3Contents:arg 0: 1arg 1: 2arg 2: 3vaTest(String, int ...): Testing: 2Contents:arg 0: 10arg 1: 20vaTest(boolean ...): Number of args: 3Contents:atg 0: truearg 1: falsearg 2: false
