Учебники

Java — Краткое руководство

Java — Обзор

Язык программирования Java изначально разрабатывался Sun Microsystems по инициативе Джеймса Гослинга и был выпущен в 1995 году как основной компонент платформы Java Sun Microsystems (Java 1.0 [J2SE]).

Последним выпуском Java Standard Edition является Java SE 8. С развитием Java и его широко распространенной популярностью были созданы различные конфигурации для различных типов платформ. Например: J2EE для корпоративных приложений, J2ME для мобильных приложений.

Новые версии J2 были переименованы в Java SE, Java EE и Java ME соответственно. Java гарантированно будет писать один раз, запустить где угодно.

Java это —

  • Объектно-ориентированный. В Java все является объектом. Java может быть легко расширена, так как она основана на объектной модели.

  • Независимо от платформы — в отличие от многих других языков программирования, включая C и C ++, когда Java компилируется, она не компилируется в машину, специфичную для платформы, а в независимый от платформы байт-код. Этот байт-код распространяется через Интернет и интерпретируется виртуальной машиной (JVM) на любой платформе, на которой он выполняется.

  • Простой — Java разработан, чтобы быть легким в изучении. Если вы понимаете основную концепцию ООП Java, это будет легко освоить.

  • Безопасный — с помощью функции безопасности Java он позволяет создавать системы без вирусов и несанкционированного доступа. Методы аутентификации основаны на шифровании с открытым ключом.

  • Независимый от архитектуры — компилятор Java генерирует независимый от архитектуры формат объектного файла, который делает исполняемый код исполняемым на многих процессорах при наличии системы времени исполнения Java.

  • Переносимость — благодаря своей независимости от архитектуры и отсутствию аспектов спецификации, зависящих от реализации, Java становится переносимым. Компилятор на Java написан на ANSI C с чистой границей переносимости, которая является подмножеством POSIX.

  • Надежный — Java прилагает усилия для устранения ситуаций, подверженных ошибкам, делая основной упор на проверку ошибок во время компиляции и проверку во время выполнения.

  • Многопоточный — с многопоточной возможностью Java можно писать программы, которые могут одновременно выполнять много задач. Эта особенность дизайна позволяет разработчикам создавать интерактивные приложения, которые могут работать бесперебойно.

  • Интерпретируемый — байт-код Java на лету транслируется в машинные инструкции и нигде не сохраняется. Процесс разработки является более быстрым и аналитическим, поскольку связывание является постепенным и легким процессом.

  • Высокая производительность. Благодаря использованию компиляторов Just-In-Time Java обеспечивает высокую производительность.

  • Распределенный — Java предназначен для распределенной среды Интернета.

  • Динамический — Java считается более динамичным, чем C или C ++, поскольку он предназначен для адаптации к развивающейся среде. Java-программы могут нести большой объем информации времени выполнения, которая может использоваться для проверки и разрешения доступа к объектам во время выполнения.

Объектно-ориентированный. В Java все является объектом. Java может быть легко расширена, так как она основана на объектной модели.

Независимо от платформы — в отличие от многих других языков программирования, включая C и C ++, когда Java компилируется, она не компилируется в машину, специфичную для платформы, а в независимый от платформы байт-код. Этот байт-код распространяется через Интернет и интерпретируется виртуальной машиной (JVM) на любой платформе, на которой он выполняется.

Простой — Java разработан, чтобы быть легким в изучении. Если вы понимаете основную концепцию ООП Java, это будет легко освоить.

Безопасный — с помощью функции безопасности Java он позволяет создавать системы без вирусов и несанкционированного доступа. Методы аутентификации основаны на шифровании с открытым ключом.

Независимый от архитектуры — компилятор Java генерирует независимый от архитектуры формат объектного файла, который делает исполняемый код исполняемым на многих процессорах при наличии системы времени исполнения Java.

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

Надежный — Java прилагает усилия для устранения ситуаций, подверженных ошибкам, делая основной упор на проверку ошибок во время компиляции и проверку во время выполнения.

Многопоточный — с многопоточной возможностью Java можно писать программы, которые могут одновременно выполнять много задач. Эта особенность дизайна позволяет разработчикам создавать интерактивные приложения, которые могут работать бесперебойно.

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

Высокая производительность. Благодаря использованию компиляторов Just-In-Time Java обеспечивает высокую производительность.

Распределенный — Java предназначен для распределенной среды Интернета.

Динамический — Java считается более динамичным, чем C или C ++, поскольку он предназначен для адаптации к развивающейся среде. Java-программы могут нести большой объем информации времени выполнения, которая может использоваться для проверки и разрешения доступа к объектам во время выполнения.

История Явы

Джеймс Гослинг начал проект по языку Java в июне 1991 года для использования в одном из своих многочисленных проектов приставок. Язык, который первоначально назывался «Дуб» в честь дуба, стоявшего рядом с офисом Гослинга, также получил название «Зеленый» и впоследствии был переименован в Java из списка случайных слов.

Sun выпустила первую публичную реализацию под названием Java 1.0 в 1995 году. Она обещала Write Once, Run Anywhere (WORA), предоставляя бесплатное время выполнения на популярных платформах.

13 ноября 2006 года Sun выпустила большую часть Java как бесплатное программное обеспечение с открытым исходным кодом на условиях GNU General Public License (GPL).

8 мая 2007 г. Sun завершила процесс, сделав весь основной код Java свободным и открытым исходным кодом, за исключением небольшой части кода, на которую Sun не имела авторских прав.

Инструменты, которые вам понадобятся

Для выполнения примеров, рассмотренных в этом руководстве, вам понадобится компьютер Pentium 200 МГц с минимум 64 МБ ОЗУ (рекомендуется 128 МБ ОЗУ).

Вам также понадобятся следующие программы —

  • Операционная система Linux 7.1 или Windows XP / 7/8
  • Java JDK 8
  • Microsoft Notepad или любой другой текстовый редактор

Этот учебник предоставит необходимые навыки для создания GUI, сетевых и веб-приложений с использованием Java.

Что дальше?

В следующей главе вы узнаете, как получить Java и ее документацию. Наконец, в нем рассказывается, как установить Java и подготовить среду для разработки приложений Java.

Java — Настройка среды

В этой главе мы обсудим различные аспекты настройки благоприятной среды для Java.

Настройка локальной среды

Если вы все еще хотите настроить свою среду для языка программирования Java, то в этом разделе вы узнаете, как загрузить и настроить Java на вашем компьютере. Ниже приведены шаги по настройке среды.

Java SE находится в свободном доступе по ссылке Скачать Java . Вы можете скачать версию на основе вашей операционной системы.

Следуйте инструкциям для загрузки Java и запуска .exe для установки Java на вашем компьютере. После того, как вы установили Java на свой компьютер, вам нужно будет установить переменные окружения, чтобы они указывали на правильные каталоги установки —

Настройка пути для Windows

Предполагая, что вы установили Java в каталог c: \ Program Files \ java \ jdk

  • Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».

  • Нажмите кнопку «Переменные среды» на вкладке «Дополнительно».

  • Теперь измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящий момент путь задан как «C: \ WINDOWS \ SYSTEM32», измените ваш путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».

Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».

Нажмите кнопку «Переменные среды» на вкладке «Дополнительно».

Теперь измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящий момент путь задан как «C: \ WINDOWS \ SYSTEM32», измените ваш путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».

Настройка пути для Linux, UNIX, Solaris, FreeBSD

Переменная среды PATH должна указывать на то, где установлены двоичные файлы Java. Обратитесь к документации по вашей оболочке, если у вас возникли проблемы с этим.

Например, если вы используете bash в качестве оболочки, вы добавили бы следующую строку в конец вашего .bashrc: export PATH = / path / to / java: $ PATH ‘

Популярные редакторы Java

Для написания ваших программ на Java вам понадобится текстовый редактор. На рынке доступны еще более сложные IDE. Но сейчас вы можете рассмотреть один из следующих —

  • Блокнот — на компьютере с Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого урока), TextPad.

  • Netbeans — Java IDE с открытым исходным кодом, который можно загрузить по адресу https://www.netbeans.org/index.html .

  • Eclipse — Java IDE, разработанная сообществом open source eclipse и может быть загружена с https://www.eclipse.org/ .

Блокнот — на компьютере с Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого урока), TextPad.

Netbeans — Java IDE с открытым исходным кодом, который можно загрузить по адресу https://www.netbeans.org/index.html .

Eclipse — Java IDE, разработанная сообществом open source eclipse и может быть загружена с https://www.eclipse.org/ .

Что дальше?

В следующей главе вы узнаете, как написать и запустить свою первую программу на Java, а также некоторые важные базовые синтаксисы на Java, необходимые для разработки приложений.

Java — основной синтаксис

Когда мы рассматриваем Java-программу, она может быть определена как набор объектов, которые взаимодействуют посредством вызова методов друг друга. Давайте теперь кратко рассмотрим, что означают класс, объект, методы и переменные экземпляра.

  • Объект — объекты имеют состояния и поведение. Пример: у собаки есть состояния — цвет, имя, порода, а также поведение, такое как вилять хвостом, лаять, есть. Объект является экземпляром класса.

  • Класс — класс можно определить как шаблон / план, описывающий поведение / состояние, поддерживаемое объектом его типа.

  • Методы . Метод — это в основном поведение. Класс может содержать много методов. Именно в методах пишутся логики, манипулируются данными и выполняются все действия.

  • Переменные экземпляра — каждый объект имеет свой уникальный набор переменных экземпляра. Состояние объекта создается значениями, назначенными этим переменным экземпляра.

Объект — объекты имеют состояния и поведение. Пример: у собаки есть состояния — цвет, имя, порода, а также поведение, такое как вилять хвостом, лаять, есть. Объект является экземпляром класса.

Класс — класс можно определить как шаблон / план, описывающий поведение / состояние, поддерживаемое объектом его типа.

Методы . Метод — это в основном поведение. Класс может содержать много методов. Именно в методах пишутся логики, манипулируются данными и выполняются все действия.

Переменные экземпляра — каждый объект имеет свой уникальный набор переменных экземпляра. Состояние объекта создается значениями, назначенными этим переменным экземпляра.

Первая Java-программа

Давайте посмотрим на простой код, который будет печатать слова Hello World .

пример

Live Demo

public class MyFirstJavaProgram {

   /* This is my first java program.
    * This will print 'Hello World' as the output
    */

   public static void main(String []args) {
      System.out.println("Hello World"); // prints Hello World
   }
}

Давайте посмотрим, как сохранить файл, скомпилировать и запустить программу. Пожалуйста, выполните следующие шаги —

  • Откройте блокнот и добавьте код, как указано выше.

  • Сохраните файл как: MyFirstJavaProgram.java.

  • Откройте окно командной строки и перейдите в каталог, где вы сохранили класс. Предположим, что это C: \.

  • Введите ‘javac MyFirstJavaProgram.java’ и нажмите клавишу ввода, чтобы скомпилировать код. Если в вашем коде нет ошибок, командная строка переместит вас на следующую строку (Предположение: переменная пути установлена).

  • Теперь введите «java MyFirstJavaProgram» для запуска вашей программы.

  • Вы сможете увидеть «Hello World», напечатанный на окне.

Откройте блокнот и добавьте код, как указано выше.

Сохраните файл как: MyFirstJavaProgram.java.

Откройте окно командной строки и перейдите в каталог, где вы сохранили класс. Предположим, что это C: \.

Введите ‘javac MyFirstJavaProgram.java’ и нажмите клавишу ввода, чтобы скомпилировать код. Если в вашем коде нет ошибок, командная строка переместит вас на следующую строку (Предположение: переменная пути установлена).

Теперь введите «java MyFirstJavaProgram» для запуска вашей программы.

Вы сможете увидеть «Hello World», напечатанный на окне.

Выход

C:\> javac MyFirstJavaProgram.java
C:\> java MyFirstJavaProgram 
Hello World

Основной синтаксис

Что касается Java-программ, очень важно помнить о следующих моментах.

  • Чувствительность к регистру — Java чувствительна к регистру, что означает, что идентификатор Hello и hello будет иметь другое значение в Java.

  • Имена классов — для всех имен классов первая буква должна быть в верхнем регистре. Если несколько слов используются для формирования имени класса, первая буква каждого внутреннего слова должна быть в верхнем регистре.

    Пример: класс MyFirstJavaClass

  • Имена методов — все имена методов должны начинаться с буквы нижнего регистра. Если для формирования имени метода используется несколько слов, то первая буква каждого внутреннего слова должна быть в верхнем регистре.

    Пример: public void myMethodName ()

  • Имя файла программы — имя файла программы должно точно соответствовать имени класса.

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

    Пример: предположим, что «MyFirstJavaProgram» — это имя класса. Затем файл должен быть сохранен как «MyFirstJavaProgram.java»

  • public static void main (String args []) — обработка программы Java начинается с метода main (), который является обязательной частью каждой программы Java.

Чувствительность к регистру — Java чувствительна к регистру, что означает, что идентификатор Hello и hello будет иметь другое значение в Java.

Имена классов — для всех имен классов первая буква должна быть в верхнем регистре. Если несколько слов используются для формирования имени класса, первая буква каждого внутреннего слова должна быть в верхнем регистре.

Пример: класс MyFirstJavaClass

Имена методов — все имена методов должны начинаться с буквы нижнего регистра. Если для формирования имени метода используется несколько слов, то первая буква каждого внутреннего слова должна быть в верхнем регистре.

Пример: public void myMethodName ()

Имя файла программы — имя файла программы должно точно соответствовать имени класса.

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

Пример: предположим, что «MyFirstJavaProgram» — это имя класса. Затем файл должен быть сохранен как «MyFirstJavaProgram.java»

public static void main (String args []) — обработка программы Java начинается с метода main (), который является обязательной частью каждой программы Java.

Идентификаторы Java

Все компоненты Java требуют имен. Имена, используемые для классов, переменных и методов, называются идентификаторами .

В Java есть несколько моментов, которые нужно помнить об идентификаторах. Они заключаются в следующем —

  • Все идентификаторы должны начинаться с буквы (от A до Z или от a до z), символа валюты ($) или подчеркивания (_).

  • После первого символа идентификаторы могут иметь любую комбинацию символов.

  • Ключевое слово не может быть использовано в качестве идентификатора.

  • Самое главное, идентификаторы чувствительны к регистру.

  • Примеры юридических идентификаторов: возраст, $ salary, _value, __1_value.

  • Примеры недопустимых идентификаторов: 123abc, -salary.

Все идентификаторы должны начинаться с буквы (от A до Z или от a до z), символа валюты ($) или подчеркивания (_).

После первого символа идентификаторы могут иметь любую комбинацию символов.

Ключевое слово не может быть использовано в качестве идентификатора.

Самое главное, идентификаторы чувствительны к регистру.

Примеры юридических идентификаторов: возраст, $ salary, _value, __1_value.

Примеры недопустимых идентификаторов: 123abc, -salary.

Модификаторы Java

Как и в других языках, можно модифицировать классы, методы и т. Д. С помощью модификаторов. Есть две категории модификаторов —

  • Модификаторы доступа — по умолчанию, общедоступные, защищенные, приватные

  • Модификаторы без доступа — окончательный, абстрактный, строгий

Модификаторы доступа — по умолчанию, общедоступные, защищенные, приватные

Модификаторы без доступа — окончательный, абстрактный, строгий

Мы рассмотрим более подробно о модификаторах в следующем разделе.

Переменные Java

Ниже приведены типы переменных в Java —

  • Локальные переменные
  • Переменные класса (статические переменные)
  • Переменные экземпляра (нестатические переменные)

Java-массивы

Массивы — это объекты, которые хранят несколько переменных одного типа. Однако сам массив является объектом в куче. Мы рассмотрим, как объявлять, конструировать и инициализировать в следующих главах.

Java Enums

Перечисления были введены в Java 5.0. Перечисления ограничивают переменную одним из нескольких предопределенных значений. Значения в этом перечисляемом списке называются перечислениями.

С помощью перечислений можно уменьшить количество ошибок в вашем коде.

Например, если мы рассмотрим заявку на магазин свежевыжатых соков, можно было бы ограничить размер стакана маленьким, средним и большим. Это позволит убедиться, что никто не сможет заказать любой размер, кроме малого, среднего или большого.

пример

Live Demo

class FreshJuice {
   enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
   FreshJuiceSize size;
}

public class FreshJuiceTest {

   public static void main(String args[]) {
      FreshJuice juice = new FreshJuice();
      juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
      System.out.println("Size: " + juice.size);
   }
}

Приведенный выше пример даст следующий результат —

Выход

Size: MEDIUM

Примечание. Перечисления могут быть объявлены как собственные или внутри класса. Методы, переменные, конструкторы также могут быть определены внутри перечислений.

Ключевые слова Java

В следующем списке показаны зарезервированные слова в Java. Эти зарезервированные слова не могут использоваться как константы или переменные или любые другие имена идентификаторов.

Аннотация утверждать логический перерыв
байт дело ловить голец
учебный класс Const Продолжить дефолт
делать двойной еще перечисление
продолжается окончательный в конце концов поплавок
за идти к если инвентарь
Импортировать экземпляр ИНТ интерфейс
долго родные новый пакет
частный защищенный общественности вернуть
короткая статический strictfp супер
переключатель синхронизированный этот бросать
бросает преходящий пытаться недействительным
летучий в то время как

Комментарии на Java

Java поддерживает однострочные и многострочные комментарии, очень похожие на C и C ++. Все символы, доступные внутри любого комментария, игнорируются компилятором Java.

пример

Live Demo

public class MyFirstJavaProgram {

   /* This is my first java program.
    * This will print 'Hello World' as the output
    * This is an example of multi-line comments.
    */

   public static void main(String []args) {
      // This is an example of single line comment
      /* This is also an example of single line comment. */
      System.out.println("Hello World");
   }
}

Выход

Hello World

Использование пустых строк

Строка, содержащая только пробел, возможно, с комментарием, называется пустой строкой, и Java полностью игнорирует ее.

наследование

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

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

Интерфейсы

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

Интерфейс определяет методы, которые должен использовать производный класс (подкласс). Но реализация методов полностью зависит от подкласса.

Что дальше?

Следующий раздел объясняет об объектах и ​​классах в программировании на Java. В конце сеанса вы сможете получить четкое представление о том, что такое объекты и что такое классы в Java.

Java — Объект и Классы

Java — это объектно-ориентированный язык. Как язык, который имеет объектно-ориентированную функцию, Java поддерживает следующие фундаментальные понятия:

  • Полиморфизм
  • наследование
  • Инкапсуляция
  • абстракция
  • Классы
  • Объекты
  • Пример
  • метод
  • Передача сообщений

В этой главе мы рассмотрим понятия — классы и объекты.

  • Объект — объекты имеют состояния и поведение. Пример: у собаки есть состояния — цвет, имя, порода, а также поведение — вилять хвостом, лаять, есть. Объект является экземпляром класса.

  • Класс — класс можно определить как шаблон / план, описывающий поведение / состояние, поддерживаемое объектом его типа.

Объект — объекты имеют состояния и поведение. Пример: у собаки есть состояния — цвет, имя, порода, а также поведение — вилять хвостом, лаять, есть. Объект является экземпляром класса.

Класс — класс можно определить как шаблон / план, описывающий поведение / состояние, поддерживаемое объектом его типа.

Объекты в Java

Давайте теперь посмотрим глубоко на то, что объекты. Если мы рассмотрим реальный мир, мы можем найти много объектов вокруг нас, автомобилей, собак, людей и т. Д. Все эти объекты имеют состояние и поведение.

Если мы рассмотрим собаку, то ее состояние — имя, порода, окрас и поведение — лает, виляет хвостом, бежит.

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

Программные объекты также имеют состояние и поведение. Состояние программного объекта сохраняется в полях, а поведение отображается с помощью методов.

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

Классы на Java

Класс — это проект, из которого создаются отдельные объекты.

Ниже приведен образец класса.

пример

public class Dog {
   String breed;
   int age;
   String color;

   void barking() {
   }

   void hungry() {
   }

   void sleeping() {
   }
}

Класс может содержать любой из следующих типов переменных.

  • Локальные переменные — переменные, определенные внутри методов, конструкторов или блоков, называются локальными переменными. Переменная будет объявлена ​​и инициализирована в методе, а переменная будет уничтожена после завершения метода.

  • Переменные экземпляра — переменные экземпляра — это переменные внутри класса, но вне какого-либо метода. Эти переменные инициализируются, когда создается экземпляр класса. Переменные экземпляра могут быть доступны из любого метода, конструктора или блоков этого конкретного класса.

  • Переменные класса — переменные класса — это переменные, объявленные внутри класса, вне любого метода, с ключевым словом static.

Локальные переменные — переменные, определенные внутри методов, конструкторов или блоков, называются локальными переменными. Переменная будет объявлена ​​и инициализирована в методе, а переменная будет уничтожена после завершения метода.

Переменные экземпляра — переменные экземпляра — это переменные внутри класса, но вне какого-либо метода. Эти переменные инициализируются, когда создается экземпляр класса. Переменные экземпляра могут быть доступны из любого метода, конструктора или блоков этого конкретного класса.

Переменные класса — переменные класса — это переменные, объявленные внутри класса, вне любого метода, с ключевым словом static.

Класс может иметь любое количество методов для доступа к значению различных видов методов. В приведенном выше примере barking (), hungry () и sleep () являются методами.

Ниже приведены некоторые важные темы, которые необходимо обсудить при изучении классов языка Java.

Конструкторы

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

Каждый раз, когда создается новый объект, будет вызван как минимум один конструктор. Основное правило конструкторов заключается в том, что они должны иметь то же имя, что и класс. Класс может иметь более одного конструктора.

Ниже приведен пример конструктора —

пример

public class Puppy {
   public Puppy() {
   }

   public Puppy(String name) {
      // This constructor has one parameter, name .
   }
}

Java также поддерживает Singleton Classes, где вы сможете создать только один экземпляр класса.

Примечание. У нас есть два разных типа конструкторов. Мы собираемся подробно обсудить конструкторы в следующих главах.

Создание объекта

Как упоминалось ранее, класс предоставляет чертежи для объектов. Таким образом, в основном, объект создается из класса. В Java новое ключевое слово используется для создания новых объектов.

Есть три шага при создании объекта из класса —

  • Объявление — объявление переменной с именем переменной с типом объекта.

  • Instantiation — ключевое слово «new» используется для создания объекта.

  • Инициализация — за ключевым словом «new» следует вызов конструктора. Этот вызов инициализирует новый объект.

Объявление — объявление переменной с именем переменной с типом объекта.

Instantiation — ключевое слово «new» используется для создания объекта.

Инициализация — за ключевым словом «new» следует вызов конструктора. Этот вызов инициализирует новый объект.

Ниже приведен пример создания объекта:

пример

Live Demo

public class Puppy {
   public Puppy(String name) {
      // This constructor has one parameter, name .
      System.out.println("Passed Name is :" + name );
   }

   public static void main(String []args) {
      // Following statement would create an object myPuppy
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

Если мы скомпилируем и запустим вышеуказанную программу, то она даст следующий результат:

Выход

Passed Name is :tommy

Доступ к переменным и методам экземпляра

Переменные и методы экземпляра доступны через созданные объекты. Чтобы получить доступ к переменной экземпляра, следующий полный путь —

/* First create an object */
ObjectReference = new Constructor();

/* Now call a variable as follows */
ObjectReference.variableName;

/* Now you can call a class method as follows */
ObjectReference.MethodName();

пример

В этом примере объясняется, как получить доступ к переменным экземпляра и методам класса.

Live Demo

public class Puppy {
   int puppyAge;

   public Puppy(String name) {
      // This constructor has one parameter, name .
      System.out.println("Name chosen is :" + name );
   }

   public void setAge( int age ) {
      puppyAge = age;
   }

   public int getAge( ) {
      System.out.println("Puppy's age is :" + puppyAge );
      return puppyAge;
   }

   public static void main(String []args) {
      /* Object creation */
      Puppy myPuppy = new Puppy( "tommy" );

      /* Call class method to set puppy's age */
      myPuppy.setAge( 2 );

      /* Call another class method to get puppy's age */
      myPuppy.getAge( );

      /* You can access instance variable as follows as well */
      System.out.println("Variable Value :" + myPuppy.puppyAge );
   }
}

Если мы скомпилируем и запустим вышеуказанную программу, то она даст следующий результат:

Выход

Name chosen is :tommy
Puppy's age is :2
Variable Value :2

Правила объявления исходного файла

Как последняя часть этого раздела, давайте теперь посмотрим на правила объявления исходного файла. Эти правила необходимы при объявлении классов, операторов импорта и операторов пакетов в исходном файле.

  • В исходном файле может быть только один открытый класс.

  • Исходный файл может иметь несколько закрытых классов.

  • Публичное имя класса также должно быть именем исходного файла, к которому в конце должен быть добавлен .java . Например: имя класса — публичный класс Employee {}, тогда исходный файл должен быть как Employee.java.

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

  • Если присутствуют операторы импорта, они должны быть записаны между оператором пакета и объявлением класса. Если нет никаких операторов пакета, то оператор импорта должен быть первой строкой в ​​исходном файле.

  • Операторы import и package будут относиться ко всем классам, присутствующим в исходном файле. Невозможно объявить разные операторы импорта и / или пакета для разных классов в исходном файле.

В исходном файле может быть только один открытый класс.

Исходный файл может иметь несколько закрытых классов.

Публичное имя класса также должно быть именем исходного файла, к которому в конце должен быть добавлен .java . Например: имя класса — публичный класс Employee {}, тогда исходный файл должен быть как Employee.java.

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

Если присутствуют операторы импорта, они должны быть записаны между оператором пакета и объявлением класса. Если нет никаких операторов пакета, то оператор импорта должен быть первой строкой в ​​исходном файле.

Операторы import и package будут относиться ко всем классам, присутствующим в исходном файле. Невозможно объявить разные операторы импорта и / или пакета для разных классов в исходном файле.

У классов есть несколько уровней доступа, и есть разные типы классов; абстрактные классы, финальные классы и т. д. Мы расскажем обо всем этом в главе, посвященной модификаторам доступа.

Помимо вышеупомянутых типов классов, в Java также есть некоторые специальные классы, называемые классами Inner и классами Anonymous.

Пакет Java

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

Импортная отчетность

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

Например, следующая строка попросит компилятор загрузить все классы, доступные в каталоге java_installation / java / io —

import java.io.*;

Простое тематическое исследование

Для нашего примера мы создадим два класса. Это Employee и EmployeeTest.

Сначала откройте блокнот и добавьте следующий код. Помните, что это класс Employee, а этот класс является публичным. Теперь сохраните этот исходный файл с именем Employee.java.

Класс Employee имеет четыре переменных экземпляра — имя, возраст, назначение и зарплата. Класс имеет один явно определенный конструктор, который принимает параметр.

пример

import java.io.*;
public class Employee {

   String name;
   int age;
   String designation;
   double salary;

   // This is the constructor of the class Employee
   public Employee(String name) {
      this.name = name;
   }

   // Assign the age of the Employee  to the variable age.
   public void empAge(int empAge) {
      age = empAge;
   }

   /* Assign the designation to the variable designation.*/
   public void empDesignation(String empDesig) {
      designation = empDesig;
   }

   /* Assign the salary to the variable	salary.*/
   public void empSalary(double empSalary) {
      salary = empSalary;
   }

   /* Print the Employee details */
   public void printEmployee() {
      System.out.println("Name:"+ name );
      System.out.println("Age:" + age );
      System.out.println("Designation:" + designation );
      System.out.println("Salary:" + salary);
   }
}

Как упоминалось ранее в этом руководстве, обработка начинается с основного метода. Поэтому, чтобы мы могли запустить этот класс Employee, должен быть метод main и объекты должны быть созданы. Мы будем создавать отдельный класс для этих задач.

Ниже приведен класс EmployeeTest , который создает два экземпляра класса Employee и вызывает методы для каждого объекта для назначения значений для каждой переменной.

Сохраните следующий код в файле EmployeeTest.java.

import java.io.*;
public class EmployeeTest {

   public static void main(String args[]) {
      /* Create two objects using constructor */
      Employee empOne = new Employee("James Smith");
      Employee empTwo = new Employee("Mary Anne");

      // Invoking methods for each object created
      empOne.empAge(26);
      empOne.empDesignation("Senior Software Engineer");
      empOne.empSalary(1000);
      empOne.printEmployee();

      empTwo.empAge(21);
      empTwo.empDesignation("Software Engineer");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

Теперь скомпилируйте оба класса и запустите EmployeeTest, чтобы увидеть результат следующим образом:

Выход

C:\> javac Employee.java
C:\> javac EmployeeTest.java
C:\> java EmployeeTest
Name:James Smith
Age:26
Designation:Senior Software Engineer
Salary:1000.0
Name:Mary Anne
Age:21
Designation:Software Engineer
Salary:500.0

Что дальше?

На следующем занятии мы обсудим основные типы данных в Java и то, как их можно использовать при разработке приложений Java.

Java — Конструкторы

Конструктор инициализирует объект при его создании. Он имеет то же имя, что и его класс, и синтаксически похож на метод. Однако конструкторы не имеют явного возвращаемого типа.

Как правило, вы будете использовать конструктор для присвоения начальных значений переменным экземпляра, определенным классом, или для выполнения любых других процедур запуска, необходимых для создания полностью сформированного объекта.

Все классы имеют конструкторы, независимо от того, определяете вы их или нет, потому что Java автоматически предоставляет конструктор по умолчанию, который инициализирует все переменные-члены нулями. Однако, как только вы определите свой собственный конструктор, конструктор по умолчанию больше не будет использоваться.

Синтаксис

Ниже приводится синтаксис конструктора —

class ClassName {
   ClassName() {
   }
}

Java допускает два типа конструкторов, а именно —

  • Без аргументов Конструкторы
  • Параметризованные Конструкторы

Без аргументов Конструкторы

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

пример

Public class MyClass {
   Int num;
   MyClass() {
      num = 100;
   }
}

Вы бы вызвали конструктор для инициализации объектов следующим образом

public class ConsDemo {
   public static void main(String args[]) {
      MyClass t1 = new MyClass();
      MyClass t2 = new MyClass();
      System.out.println(t1.num + " " + t2.num);
   }
}

Это дало бы следующий результат

100 100

Параметризованные Конструкторы

Чаще всего вам понадобится конструктор, который принимает один или несколько параметров. Параметры добавляются в конструктор так же, как они добавляются в метод, просто объявляйте их в скобках после имени конструктора.

пример

Вот простой пример, который использует конструктор —

// A simple constructor.
class MyClass {
   int x;
   
   // Following is the constructor
   MyClass(int i ) {
      x = i;
   }
}

Вы бы вызвали конструктор для инициализации объектов следующим образом:

public class ConsDemo {
   public static void main(String args[]) {
      MyClass t1 = new MyClass( 10 );
      MyClass t2 = new MyClass( 20 );
      System.out.println(t1.x + " " + t2.x);
   }
}

Это даст следующий результат —

10 20

Java — основные типы данных

Переменные — это не что иное, как зарезервированные области памяти для хранения значений. Это означает, что когда вы создаете переменную, вы резервируете некоторое пространство в памяти.

На основе типа данных переменной операционная система выделяет память и решает, что можно сохранить в зарезервированной памяти. Поэтому, назначая переменным разные типы данных, вы можете хранить целые, десятичные или символы в этих переменных.

В Java есть два типа данных:

  • Примитивные типы данных
  • Типы данных Ссылка / Объект

Примитивные типы данных

В Java поддерживается восемь примитивных типов данных. Примитивные типы данных предопределены языком и названы ключевым словом. Давайте теперь подробно рассмотрим восемь примитивных типов данных.

байт

  • Байтовый тип данных представляет собой 8-разрядное целое число со знаком в виде двух чисел

  • Минимальное значение -128 (-2 ^ 7)

  • Максимальное значение 127 (включительно) (2 ^ 7 -1)

  • Значение по умолчанию 0

  • Байтовый тип данных используется для экономии места в больших массивах, в основном вместо целых чисел, поскольку байт в четыре раза меньше целого числа.

  • Пример: байт a = 100, байт b = -50

Байтовый тип данных представляет собой 8-разрядное целое число со знаком в виде двух чисел

Минимальное значение -128 (-2 ^ 7)

Максимальное значение 127 (включительно) (2 ^ 7 -1)

Значение по умолчанию 0

Байтовый тип данных используется для экономии места в больших массивах, в основном вместо целых чисел, поскольку байт в четыре раза меньше целого числа.

Пример: байт a = 100, байт b = -50

короткая

  • Короткий тип данных — это 16-разрядное целое число со знаком в виде двоичного числа со знаком

  • Минимальное значение -32 768 (-2 ^ 15)

  • Максимальное значение 32 767 (включительно) (2 ^ 15 -1)

  • Короткий тип данных также может использоваться для сохранения памяти в виде байтового типа данных. Короткое в 2 раза меньше целого

  • Значение по умолчанию 0.

  • Пример: короткое s = 10000, короткое r = -20000

Короткий тип данных — это 16-разрядное целое число со знаком в виде двоичного числа со знаком

Минимальное значение -32 768 (-2 ^ 15)

Максимальное значение 32 767 (включительно) (2 ^ 15 -1)

Короткий тип данных также может использоваться для сохранения памяти в виде байтового типа данных. Короткое в 2 раза меньше целого

Значение по умолчанию 0.

Пример: короткое s = 10000, короткое r = -20000

ИНТ

  • Тип данных Int — это 32-разрядное целое число со знаком в виде двоичного числа со знаком.

  • Минимальное значение — 2 147 483 648 (-2 ^ 31)

  • Максимальное значение — 2 147 483 647 (включительно) (2 ^ 31 -1)

  • Целочисленное значение обычно используется как тип данных по умолчанию для целочисленных значений, если только нет проблем с памятью.

  • Значение по умолчанию 0

  • Пример: int a = 100000, int b = -200000

Тип данных Int — это 32-разрядное целое число со знаком в виде двоичного числа со знаком.

Минимальное значение — 2 147 483 648 (-2 ^ 31)

Максимальное значение — 2 147 483 647 (включительно) (2 ^ 31 -1)

Целочисленное значение обычно используется как тип данных по умолчанию для целочисленных значений, если только нет проблем с памятью.

Значение по умолчанию 0

Пример: int a = 100000, int b = -200000

долго

  • Длинный тип данных — это 64-разрядное целое число со знаком в виде двоичного числа со знаком
  • Минимальное значение -9,223,372,036,854,775,808 (-2 ^ 63)
  • Максимальное значение — 9 223 372 036 854 775 807 (включительно) (2 ^ 63 -1)
  • Этот тип используется, когда требуется более широкий диапазон, чем int
  • Значение по умолчанию 0L
  • Пример: long a = 100000L, long b = -200000L

поплавок

  • Тип данных с плавающей запятой — 32-битная IEEE 754 с плавающей запятой одинарной точности

  • Float в основном используется для сохранения памяти в больших массивах чисел с плавающей точкой

  • Значение по умолчанию 0,0f

  • Тип данных с плавающей запятой никогда не используется для точных значений, таких как валюта

  • Пример: float f1 = 234.5f

Тип данных с плавающей запятой — 32-битная IEEE 754 с плавающей запятой одинарной точности

Float в основном используется для сохранения памяти в больших массивах чисел с плавающей точкой

Значение по умолчанию 0,0f

Тип данных с плавающей запятой никогда не используется для точных значений, таких как валюта

Пример: float f1 = 234.5f

двойной

  • двойной тип данных — 64-разрядная IEEE 754 с плавающей запятой двойной точности

  • Этот тип данных обычно используется как тип данных по умолчанию для десятичных значений, как правило, выбор по умолчанию

  • Двойной тип данных никогда не должен использоваться для точных значений, таких как валюта

  • Значение по умолчанию — 0.0d

  • Пример: double d1 = 123,4

двойной тип данных — 64-разрядная IEEE 754 с плавающей запятой двойной точности

Этот тип данных обычно используется как тип данных по умолчанию для десятичных значений, как правило, выбор по умолчанию

Двойной тип данных никогда не должен использоваться для точных значений, таких как валюта

Значение по умолчанию — 0.0d

Пример: double d1 = 123,4

логический

  • логический тип данных представляет один бит информации
  • Есть только два возможных значения: истина и ложь
  • Этот тип данных используется для простых флагов, которые отслеживают истинные / ложные условия
  • Значением по умолчанию является false
  • Пример: boolean one = true

голец

  • тип данных char — это один 16-битный символ Unicode
  • Минимальное значение равно «\ u0000» (или 0)
  • Максимальное значение ‘\ uffff’ (или 65 535 включительно)
  • Тип данных Char используется для хранения любого символа
  • Пример: буква char = A

Типы справочных данных

  • Ссылочные переменные создаются с использованием определенных конструкторов классов. Они используются для доступа к объектам. Эти переменные объявлены определенного типа, которые нельзя изменить. Например, Сотрудник, Щенок и т. Д.

  • Объекты класса и различные типы переменных массива попадают под ссылочный тип данных.

  • Значение по умолчанию для любой ссылочной переменной равно нулю.

  • Ссылочная переменная может использоваться для ссылки на любой объект объявленного типа или любого совместимого типа.

  • Пример: животное животное = новое животное («жираф»);

Ссылочные переменные создаются с использованием определенных конструкторов классов. Они используются для доступа к объектам. Эти переменные объявлены определенного типа, которые нельзя изменить. Например, Сотрудник, Щенок и т. Д.

Объекты класса и различные типы переменных массива попадают под ссылочный тип данных.

Значение по умолчанию для любой ссылочной переменной равно нулю.

Ссылочная переменная может использоваться для ссылки на любой объект объявленного типа или любого совместимого типа.

Пример: животное животное = новое животное («жираф»);

Java Literal

Литерал — это представление исходного кода с фиксированным значением. Они представлены непосредственно в коде без каких-либо вычислений.

Литералы могут быть назначены любой переменной типа примитива. Например —

byte a = 68;
char a = 'A';

byte, int, long и short также могут быть выражены в десятичных (основание 10), шестнадцатеричных (основание 16) или восьмеричных (основание 8) системах счисления.

Префикс 0 используется для обозначения восьмеричного числа, а префикс 0x обозначает шестнадцатеричное при использовании этих систем счисления для литералов. Например —

int decimal = 100;
int octal = 0144;
int hexa =  0x64;

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

пример

"Hello World"
"two\nlines"
"\"This is in quotes\""

Строковые и символьные типы литералов могут содержать любые символы Юникода. Например —

char a = '\u0001';
String a = "\u0001";

Язык Java также поддерживает несколько специальных escape-последовательностей для строковых и символьных литералов. Они —

нотация Персонаж представлен
\ п Новая строка (0x0a)
Возврат каретки (0x0d)
\ е Formfeed (0x0c)
\ б Backspace (0x08)
\ s Пробел (0x20)
\ т табуляция
Двойная цитата
Одинарные цитаты
\\ обратный слэш
\ ддд Восьмеричный символ (ддд)
\ ихххх Шестнадцатеричный символ UNICODE (xxxx)

Что дальше?

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

Java — типы переменных

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

Вы должны объявить все переменные, прежде чем их можно будет использовать. Ниже приведена основная форма объявления переменной:

data type variable [ = value][, variable [ = value] ...] ;

Здесь тип данных является одним из типов данных Java, а переменная — это имя переменной. Чтобы объявить более одной переменной указанного типа, вы можете использовать список через запятую.

Ниже приведены допустимые примеры объявления и инициализации переменных в Java.

пример

int a, b, c;         // Declares three ints, a, b, and c.
int a = 10, b = 10;  // Example of initialization
byte B = 22;         // initializes a byte type variable B.
double pi = 3.14159; // declares and assigns a value of PI.
char a = 'A';        // the char variable a iis initialized with value 'a'

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

  • Локальные переменные
  • Переменные экземпляра
  • Класс / Статические переменные

Локальные переменные

  • Локальные переменные объявляются в методах, конструкторах или блоках.

  • Локальные переменные создаются при вводе метода, конструктора или блока, и эта переменная будет уничтожена после выхода из метода, конструктора или блока.

  • Модификаторы доступа нельзя использовать для локальных переменных.

  • Локальные переменные видны только внутри объявленного метода, конструктора или блока.

  • Локальные переменные реализованы на уровне стека внутри.

  • Не существует значения по умолчанию для локальных переменных, поэтому следует объявить локальные переменные и назначить начальное значение перед первым использованием.

Локальные переменные объявляются в методах, конструкторах или блоках.

Локальные переменные создаются при вводе метода, конструктора или блока, и эта переменная будет уничтожена после выхода из метода, конструктора или блока.

Модификаторы доступа нельзя использовать для локальных переменных.

Локальные переменные видны только внутри объявленного метода, конструктора или блока.

Локальные переменные реализованы на уровне стека внутри.

Не существует значения по умолчанию для локальных переменных, поэтому следует объявить локальные переменные и назначить начальное значение перед первым использованием.

пример

Здесь возраст является локальной переменной. Это определено внутри метода pupAge (), и его область действия ограничена только этим методом.

Live Demo

public class Test {
   public void pupAge() {
      int age = 0;
      age = age + 7;
      System.out.println("Puppy age is : " + age);
   }

   public static void main(String args[]) {
      Test test = new Test();
      test.pupAge();
   }
}

Это даст следующий результат —

Выход

Puppy age is: 7

пример

В следующем примере используется age без инициализации, поэтому во время компиляции выдается ошибка.

Live Demo

public class Test {
   public void pupAge() {
      int age;
      age = age + 7;
      System.out.println("Puppy age is : " + age);
   }

   public static void main(String args[]) {
      Test test = new Test();
      test.pupAge();
   }
}

Это приведет к следующей ошибке при компиляции —

Выход

Test.java:4:variable number might not have been initialized
age = age + 7;
         ^
1 error

Переменные экземпляра

  • Переменные экземпляра объявляются в классе, но вне метода, конструктора или любого блока.

  • Когда место выделяется для объекта в куче, создается слот для каждого значения переменной экземпляра.

  • Переменные экземпляра создаются при создании объекта с использованием ключевого слова «new» и уничтожаются при уничтожении объекта.

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

  • Переменные экземпляра могут быть объявлены на уровне класса до или после использования.

  • Модификаторы доступа могут быть заданы для переменных экземпляра.

  • Переменные экземпляра видимы для всех методов, конструкторов и блоков в классе. Обычно рекомендуется сделать эти переменные приватными (уровень доступа). Однако видимость для подклассов может быть предоставлена ​​для этих переменных с использованием модификаторов доступа.

  • Переменные экземпляра имеют значения по умолчанию. Для чисел значением по умолчанию является 0, для логических значений — false, а для ссылок на объекты — null. Значения могут быть назначены во время объявления или внутри конструктора.

  • К переменным экземпляра можно обращаться напрямую, вызывая имя переменной внутри класса. Однако в статических методах (когда переменным экземпляра предоставляется доступ), они должны вызываться с использованием полного имени. ObjectReference.VariableName .

Переменные экземпляра объявляются в классе, но вне метода, конструктора или любого блока.

Когда место выделяется для объекта в куче, создается слот для каждого значения переменной экземпляра.

Переменные экземпляра создаются при создании объекта с использованием ключевого слова «new» и уничтожаются при уничтожении объекта.

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

Переменные экземпляра могут быть объявлены на уровне класса до или после использования.

Модификаторы доступа могут быть заданы для переменных экземпляра.

Переменные экземпляра видимы для всех методов, конструкторов и блоков в классе. Обычно рекомендуется сделать эти переменные приватными (уровень доступа). Однако видимость для подклассов может быть предоставлена ​​для этих переменных с использованием модификаторов доступа.

Переменные экземпляра имеют значения по умолчанию. Для чисел значением по умолчанию является 0, для логических значений — false, а для ссылок на объекты — null. Значения могут быть назначены во время объявления или внутри конструктора.

К переменным экземпляра можно обращаться напрямую, вызывая имя переменной внутри класса. Однако в статических методах (когда переменным экземпляра предоставляется доступ), они должны вызываться с использованием полного имени. ObjectReference.VariableName .

пример

Live Demo

import java.io.*;
public class Employee {

   // this instance variable is visible for any child class.
   public String name;

   // salary  variable is visible in Employee class only.
   private double salary;

   // The name variable is assigned in the constructor.
   public Employee (String empName) {
      name = empName;
   }

   // The salary variable is assigned a value.
   public void setSalary(double empSal) {
      salary = empSal;
   }

   // This method prints the employee details.
   public void printEmp() {
      System.out.println("name  : " + name );
      System.out.println("salary :" + salary);
   }

   public static void main(String args[]) {
      Employee empOne = new Employee("Ransika");
      empOne.setSalary(1000);
      empOne.printEmp();
   }
}

Это даст следующий результат —

Выход

name  : Ransika
salary :1000.0

Класс / Статические Переменные

  • Переменные класса, также известные как статические переменные, объявляются с ключевым словом static в классе, но вне метода, конструктора или блока.

  • В каждом классе будет только одна копия каждой переменной класса, независимо от того, сколько объектов создано из нее.

  • Статические переменные редко используются, кроме тех, которые объявлены как константы. Константы — это переменные, которые объявлены как public / private, final и static. Постоянные переменные никогда не изменяются от их начального значения.

  • Статические переменные хранятся в статической памяти. Редко использовать статические переменные, отличные от объявленных final и используемые как открытые или закрытые константы.

  • Статические переменные создаются при запуске программы и уничтожаются при ее остановке.

  • Видимость аналогична переменным экземпляра. Однако большинство статических переменных объявляются общедоступными, поскольку они должны быть доступны для пользователей класса.

  • Значения по умолчанию такие же, как переменные экземпляра. Для чисел значением по умолчанию является 0; для булевых это неверно; и для ссылок на объект это нуль. Значения могут быть назначены во время объявления или внутри конструктора. Кроме того, значения могут быть назначены в специальных статических блоках инициализатора.

  • Доступ к статическим переменным можно получить, вызвав имя класса ClassName.VariableName .

  • Когда объявляются переменные класса как public static final, тогда имена переменных (константы) пишутся в верхнем регистре. Если статические переменные не являются общедоступными и окончательными, синтаксис именования совпадает с экземпляром и локальными переменными.

Переменные класса, также известные как статические переменные, объявляются с ключевым словом static в классе, но вне метода, конструктора или блока.

В каждом классе будет только одна копия каждой переменной класса, независимо от того, сколько объектов создано из нее.

Статические переменные редко используются, кроме тех, которые объявлены как константы. Константы — это переменные, которые объявлены как public / private, final и static. Постоянные переменные никогда не изменяются от их начального значения.

Статические переменные хранятся в статической памяти. Редко использовать статические переменные, отличные от объявленных final и используемые как открытые или закрытые константы.

Статические переменные создаются при запуске программы и уничтожаются при ее остановке.

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

Значения по умолчанию такие же, как переменные экземпляра. Для чисел значением по умолчанию является 0; для булевых это неверно; и для ссылок на объект это нуль. Значения могут быть назначены во время объявления или внутри конструктора. Кроме того, значения могут быть назначены в специальных статических блоках инициализатора.

Доступ к статическим переменным можно получить, вызвав имя класса ClassName.VariableName .

Когда объявляются переменные класса как public static final, тогда имена переменных (константы) пишутся в верхнем регистре. Если статические переменные не являются общедоступными и окончательными, синтаксис именования совпадает с экземпляром и локальными переменными.

пример

Live Demo

import java.io.*;
public class Employee {

   // salary  variable is a private static variable
   private static double salary;

   // DEPARTMENT is a constant
   public static final String DEPARTMENT = "Development ";

   public static void main(String args[]) {
      salary = 1000;
      System.out.println(DEPARTMENT + "average salary:" + salary);
   }
}

Это даст следующий результат —

Выход

Development average salary:1000

Примечание. Если к переменным обращаются из внешнего класса, к константе следует обращаться как Employee.DEPARTMENT

Что дальше?

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

Java — Типы модификаторов

Модификаторы — это ключевые слова, которые вы добавляете в эти определения, чтобы изменить их значения. Язык Java имеет широкий спектр модификаторов, включая следующие:

Модификаторы доступа к Java

Без доступа модификаторы

Чтобы использовать модификатор, вы включаете его ключевое слово в определение класса, метода или переменной. Модификатор предшествует остальной части оператора, как в следующем примере.

пример

public class className {
   // ...
}

private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;

public static void main(String[] arguments) {
   // body of method
}

Модификаторы контроля доступа

Java предоставляет ряд модификаторов доступа для установки уровней доступа для классов, переменных, методов и конструкторов. Четыре уровня доступа —

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

Модификаторы без доступа

Java предоставляет ряд модификаторов без доступа для достижения многих других функций.

  • Статический модификатор для создания методов класса и переменных.

  • Последний модификатор для завершения реализации классов, методов и переменных.

  • Модификатор abstract для создания абстрактных классов и методов.

  • Синхронизированные и изменчивые модификаторы, которые используются для потоков.

Статический модификатор для создания методов класса и переменных.

Последний модификатор для завершения реализации классов, методов и переменных.

Модификатор abstract для создания абстрактных классов и методов.

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

Что дальше?

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

Java — Основные операторы

Java предоставляет богатый набор операторов для работы с переменными. Мы можем разделить все операторы Java на следующие группы:

  • Арифметические Операторы
  • Операторы отношений
  • Битовые операторы
  • Логические Операторы
  • Операторы присваивания
  • Разные Операторы

Арифметические операторы

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

Предположим, что целочисленная переменная A содержит 10, а переменная B содержит 20, тогда —

Показать примеры

оператор Описание пример
+ (Дополнение) Добавляет значения по обе стороны от оператора. А + Б даст 30
— (вычитание) Вычитает правый операнд из левого операнда. A — B даст -10
* (Умножение) Умножает значения по обе стороны от оператора. А * Б даст 200
/ (Отдел) Делит левый операнд на правый операнд. Б / у даст 2
% (Модуль) Делит левый операнд на правый операнд и возвращает остаток. B% A даст 0
++ (Увеличение) Увеличивает значение операнда на 1. B ++ дает 21
— (Уменьшение) Уменьшает значение операнда на 1. Б— дает 19

Реляционные операторы

Существуют следующие реляционные операторы, поддерживаемые языком Java.

Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда —

Показать примеры

оператор Описание пример
== (равно) Проверяет, равны ли значения двух операндов или нет, если да, тогда условие становится истинным. (A == B) не соответствует действительности.
!= (Не равно) Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. (A! = B) верно.
> (больше чем) Проверяет, больше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. (A> B) не соответствует действительности.
<(меньше чем) Проверяет, меньше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. (A <B) верно.
> = (больше или равно) Проверяет, больше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. (A> = B) не соответствует действительности.
<= (меньше или равно) Проверяет, меньше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. (A <= B) верно.

Битовые операторы

Java определяет несколько побитовых операторов, которые можно применять к целочисленным типам, long, int, short, char и byte.

Побитовый оператор работает с битами и выполняет побитовую операцию. Предположим, если a = 60 и b = 13; теперь в двоичном формате они будут выглядеть следующим образом —

а = 0011 1100

b = 0000 1101

——————

A & B = 0000 1100

a | b = 0011 1101

a ^ b = 0011 0001

~ a = 1100 0011

В следующей таблице перечислены побитовые операторы —

Предположим, что целочисленная переменная A содержит 60, а переменная B содержит 13, тогда —

Показать примеры

оператор Описание пример
& (поразрядно и) Двоичный оператор AND немного копирует результат, если он существует в обоих операндах. (A & B) даст 12, что 0000 1100
| (поразрядно или) Оператор двоичного ИЛИ копирует немного, если он существует в любом из операндов. (A | B) даст 61, что составляет 0011 1101
^ (побитовый XOR) Двоичный оператор XOR копирует бит, если он установлен в одном операнде, но не в обоих. (A ^ B) даст 49, который является 0011 0001
~ (побитовый комплимент) Оператор дополнения двоичных единиц является унарным и имеет эффект «переворачивания» битов. (~ A) даст -61, что составляет 1100 0011 в форме дополнения 2 из-за двоичного числа со знаком.
<< (сдвиг влево) Двоичный оператор левого сдвига. Значение левого операнда перемещается влево на количество битов, указанное правым операндом. << 2 даст 240, что составляет 1111 0000
>> (сдвиг вправо) Оператор двоичного правого сдвига. Значение левого операнда перемещается вправо на количество битов, указанное правым операндом. A >> 2 даст 15, что составляет 1111
>>> (заполнение нуля сдвиг вправо) Сдвиг вправо, оператор заполнения нуля. Значение левого операнда перемещается вправо на количество битов, указанное правым операндом, а сдвинутые значения заполняются нулями. A >>> 2 даст 15, что равно 0000 1111

Логические операторы

В следующей таблице перечислены логические операторы —

Предположим, что булевы переменные A верны, а переменная B ложна, тогда —

Показать примеры

оператор Описание пример
&& (логично и) Называется логический оператор И. Если оба операнда отличны от нуля, условие становится истинным. (A && B) неверно
|| (логично или) Вызывается логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, условие становится истинным. (A || B) верно
! (логично нет) Вызывается логическим оператором НЕ. Используйте для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ будет делать ложь. ! (A && B) верно

Операторы присваивания

Ниже приведены операторы присваивания, поддерживаемые языком Java.

Показать примеры

оператор Описание пример
знак равно Простой оператор присваивания. Назначает значения от правых операндов к левому операнду. C = A + B назначит значение A + B в C
+ = Добавить И оператор присваивания. Он добавляет правый операнд к левому операнду и присваивает результат левому операнду. C + = A эквивалентно C = C + A
знак равно Вычитание И оператор присваивания. Вычитает правый операнд из левого операнда и присваивает результат левому операнду. C — = A эквивалентно C = C — A
знак равно Оператор умножения И присваивания. Он умножает правый операнд на левый операнд и присваивает результат левому операнду. C * = A эквивалентно C = C * A
знак равно Оператор деления И присваивания. Он делит левый операнд на правый операнд и присваивает результат левому операнду. C / = A эквивалентно C = C / A
знак равно Модуль И оператор присваивания. Он принимает модуль с использованием двух операндов и присваивает результат левому операнду. C% = A эквивалентно C = C% A
<< = Левый сдвиг И оператор присваивания. C << = 2 совпадает с C = C << 2
>> = Сдвиг вправо И оператор присваивания. C >> = 2 — это то же самое, что C = C >> 2
знак равно Побитовое И оператор присваивания. C & = 2 совпадает с C = C & 2
^ = побитовое исключающее ИЛИ и оператор присваивания. C ^ = 2 совпадает с C = C ^ 2
| = побитовое ИЛИ и оператор присваивания. C | = 2 — это то же самое, что C = C | 2

Разные операторы

Есть несколько других операторов, поддерживаемых языком Java.

Условный оператор (?:)

Условный оператор также известен как троичный оператор . Этот оператор состоит из трех операндов и используется для вычисления логических выражений. Цель оператора — решить, какое значение следует присвоить переменной. Оператор записывается как —

variable x = (expression) ? value if true : value if false

Ниже приведен пример —

пример

Live Demo

public class Test {

   public static void main(String args[]) {
      int a, b;
      a = 10;
      b = (a == 1) ? 20: 30;
      System.out.println( "Value of b is : " +  b );

      b = (a == 10) ? 20: 30;
      System.out.println( "Value of b is : " + b );
   }
}

Это даст следующий результат —

Выход

Value of b is : 30
Value of b is : 20

Оператор instanceof

Этот оператор используется только для ссылочных переменных объекта. Оператор проверяет, принадлежит ли объект определенному типу (типу класса или типу интерфейса). Оператор instanceof записывается как —

( Object reference variable ) instanceof  (class/interface type)

Если объект, на который ссылается переменная с левой стороны оператора, проходит проверку IS-A для типа класса / интерфейса с правой стороны, то результат будет истинным. Ниже приведен пример —

пример

Live Demo

public class Test {

   public static void main(String args[]) {

      String name = "James";

      // following will return true since name is type of String
      boolean result = name instanceof String;
      System.out.println( result );
   }
}

Это даст следующий результат —

Выход

true

Этот оператор все равно вернет true, если сравниваемый объект является присваиванием, совместимым с типом справа. Ниже приведен еще один пример —

пример

Live Demo

class Vehicle {}

public class Car extends Vehicle {

   public static void main(String args[]) {

      Vehicle a = new Car();
      boolean result =  a instanceof Car;
      System.out.println( result );
   }
}

Это даст следующий результат —

Выход

true

Приоритет Java-операторов

Приоритет оператора определяет группировку терминов в выражении. Это влияет на то, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения —

Например, х = 7 + 3 * 2; здесь x назначено 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем прибавляется к 7.

Здесь операторы с самым высоким приоритетом отображаются вверху таблицы, а операторы с самым низким — внизу. Внутри выражения операторы с более высоким приоритетом будут оцениваться первыми.

категория оператор Ассоциативность
постфикс выражение ++ выражение— Слева направо
Одинарный ++ выражение –- выражение + выражение –выражение ~! Справа налево
Multiplicative * /% Слева направо
присадка + — Слева направо
сдвиг << >> >>> Слева направо
реляционный <> <=> = instanceof Слева направо
равенство ==! = Слева направо
Побитовое И & Слева направо
Побитовый XOR ^ Слева направо
Побитовое ИЛИ | Слева направо
Логическое И && Слева направо
Логическое ИЛИ || Слева направо
условный ?: Справа налево
присваивание = + = — = * = / =% = ^ = | = << = >> = >>> = Справа налево

Что дальше?

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

Java — Loop Control

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

Языки программирования предоставляют различные управляющие структуры, которые допускают более сложные пути выполнения.

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.

Петлевая архитектура

Язык программирования Java предоставляет следующие типы циклов для обработки требований циклов. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No. Цикл и описание
1 в то время как цикл

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

2 для цикла

Выполнить последовательность операторов несколько раз и сократить код, который управляет переменной цикла.

3 делать … пока цикл

Как оператор while, за исключением того, что он проверяет условие в конце тела цикла.

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

Выполнить последовательность операторов несколько раз и сократить код, который управляет переменной цикла.

Как оператор while, за исключением того, что он проверяет условие в конце тела цикла.

Заявления о контроле цикла

Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.

Java поддерживает следующие операторы управления. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No. Контрольное заявление и описание
1 заявление о нарушении

Завершает оператор цикла или переключателя и передает выполнение в оператор, следующий сразу за циклом или переключателем.

2 продолжить заявление

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

Завершает оператор цикла или переключателя и передает выполнение в оператор, следующий сразу за циклом или переключателем.

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

Улучшено для цикла в Java

Начиная с Java 5 был представлен расширенный цикл for. Это в основном используется для обхода коллекции элементов, включая массивы.

Синтаксис

Ниже приведен синтаксис расширенного цикла for —

for(declaration : expression) {
   // Statements
}
  • Объявление — Недавно объявленная блочная переменная имеет тип, совместимый с элементами массива, к которому вы обращаетесь. Переменная будет доступна в блоке for, и ее значение будет таким же, как у текущего элемента массива.

  • Выражение — это вычисляет массив, который вам нужно перебрать. Выражение может быть переменной массива или вызовом метода, который возвращает массив.

Объявление — Недавно объявленная блочная переменная имеет тип, совместимый с элементами массива, к которому вы обращаетесь. Переменная будет доступна в блоке for, и ее значение будет таким же, как у текущего элемента массива.

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

пример

Live Demo

public class Test {

   public static void main(String args[]) {
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ) {
         System.out.print( x );
         System.out.print(",");
      }
      System.out.print("\n");
      String [] names = {"James", "Larry", "Tom", "Lacy"};

      for( String name : names ) {
         System.out.print( name );
         System.out.print(",");
      }
   }
}

Это даст следующий результат —

Выход

10, 20, 30, 40, 50,
James, Larry, Tom, Lacy,

Что дальше?

В следующей главе мы узнаем об утверждении решений в Java-программировании.

Java — принятие решений

Структуры принятия решений имеют одно или несколько условий, которые должны быть оценены или протестированы программой, а также оператор или операторы, которые должны быть выполнены, если условие определено как истинное, и, необязательно, другие операторы, которые должны быть выполнены, если условие определено быть ложным.

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

Принятие решения

Язык программирования Java предоставляет следующие типы операторов принятия решений. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No. Заявление и описание
1 если заявление

Оператор if состоит из логического выражения, за которым следует одно или несколько операторов.

2 если … еще заявление

За оператором if может следовать необязательный оператор else , который выполняется, когда логическое выражение имеет значение false.

3 вложенный оператор if

Вы можете использовать один оператор if или else if внутри другого оператора if или else if .

4 заявление о переключении

Оператор switch позволяет проверять переменную на соответствие списку значений.

Оператор if состоит из логического выражения, за которым следует одно или несколько операторов.

За оператором if может следовать необязательный оператор else , который выполняется, когда логическое выражение имеет значение false.

Вы можете использовать один оператор if или else if внутри другого оператора if или else if .

Оператор switch позволяет проверять переменную на соответствие списку значений.

? : Оператор

Мы накрыли условного оператора? : в предыдущей главе, которая может быть использована для замены операторов if … else . Он имеет следующую общую форму —

Exp1 ? Exp2 : Exp3;

Где Exp1, Exp2 и Exp3 являются выражениями. Обратите внимание на использование и размещение толстой кишки.

Чтобы определить значение всего выражения, сначала вычисляется exp1.

  • Если значение exp1 равно true, тогда значение Exp2 будет значением всего выражения.

  • Если значение exp1 равно false, тогда вычисляется Exp3, и его значение становится значением всего выражения.

Если значение exp1 равно true, тогда значение Exp2 будет значением всего выражения.

Если значение exp1 равно false, тогда вычисляется Exp3, и его значение становится значением всего выражения.

Что дальше?

В следующей главе мы обсудим класс Number (в пакете java.lang) и его подклассы на языке Java.

Мы рассмотрим некоторые ситуации, в которых вы будете использовать экземпляры этих классов, а не примитивные типы данных, а также такие классы, как форматирование, математические функции, которые вам необходимо знать при работе с Numbers.

Java — класс чисел

Обычно, когда мы работаем с Numbers, мы используем примитивные типы данных, такие как byte, int, long, double и т. Д.

пример

int i = 5000;
float gpa = 13.65;
double mask = 0xaf;

Однако в процессе разработки мы сталкиваемся с ситуациями, когда нам нужно использовать объекты вместо примитивных типов данных. Для этого в Java предусмотрены классы-оболочки .

Все классы-обертки (Integer, Long, Byte, Double, Float, Short) являются подклассами абстрактного класса Number.

Числовые классы

Объект класса-обертки содержит или оборачивает соответствующий ему примитивный тип данных. Преобразование примитивных типов данных в объект называется боксом , и компилятор позаботится об этом. Следовательно, при использовании класса-оболочки вам просто нужно передать значение примитивного типа данных в конструктор класса Wrapper.

И объект Wrapper будет преобразован обратно в примитивный тип данных, и этот процесс называется распаковкой. Класс Number является частью пакета java.lang.

Ниже приведен пример бокса и распаковки —

пример

Live Demo

public class Test {

   public static void main(String args[]) {
      Integer x = 5; // boxes int to an Integer object
      x =  x + 10;   // unboxes the Integer to a int
      System.out.println(x); 
   }
}

Это даст следующий результат —

Выход

15

Когда x назначается целочисленное значение, компилятор упаковывает целое число, потому что x является целочисленным объектом. Позже, x распаковывается, так что они могут быть добавлены как целое число.

Численные методы

Ниже приведен список методов экземпляров, которые реализуются всеми подклассами класса Number.

Sr.No. Метод и описание
1 xxxValue ()

Преобразует значение этого объекта Number в тип данных xxx и возвращает его.

2 сравнить с()

Сравнивает этот объект Number с аргументом.

3 равна ()

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

4 ценность()

Возвращает объект Integer, содержащий значение указанного примитива.

5 нанизывать()

Возвращает объект String, представляющий значение указанного типа int или Integer.

6 ParseInt ()

Этот метод используется для получения примитивного типа данных определенной строки.

7 абс ()

Возвращает абсолютное значение аргумента.

8 CEIL ()

Возвращает наименьшее целое число, которое больше или равно аргументу. Вернулся как двойной.

9 этаж()

Возвращает наибольшее целое число, которое меньше или равно аргументу. Вернулся как двойной.

10 ечать ()

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

11 круглый()

Возвращает ближайший long или int, как указано типом возврата метода к аргументу.

12 мин ()

Возвращает меньший из двух аргументов.

13 Максимум()

Возвращает больший из двух аргументов.

14 ехр ()

Возвращает основание натуральных логарифмов e в силу аргумента.

15 журнал()

Возвращает натуральный логарифм аргумента.

16 POW ()

Возвращает значение первого аргумента, возведенного в степень второго аргумента.

17 SQRT ()

Возвращает квадратный корень аргумента.

18 грех ()

Возвращает синус указанного двойного значения.

19 сов ()

Возвращает косинус указанного двойного значения.

20 тангенс ()

Возвращает тангенс указанного двойного значения.

21 как в()

Возвращает арксинус указанного двойного значения.

22 экоса ()

Возвращает арккозин указанного двойного значения.

23 загар()

Возвращает арктангенс указанного двойного значения.

24 atan2 ()

Преобразует прямоугольные координаты (x, y) в полярные координаты (r, theta) и возвращает theta.

25 toDegrees ()

Преобразует аргумент в градусы.

26 toRadians ()

Преобразует аргумент в радианы.

27 случайным образом ()

Возвращает случайное число.

Преобразует значение этого объекта Number в тип данных xxx и возвращает его.

Сравнивает этот объект Number с аргументом.

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

Возвращает объект Integer, содержащий значение указанного примитива.

Возвращает объект String, представляющий значение указанного типа int или Integer.

Этот метод используется для получения примитивного типа данных определенной строки.

Возвращает абсолютное значение аргумента.

Возвращает наименьшее целое число, которое больше или равно аргументу. Вернулся как двойной.

Возвращает наибольшее целое число, которое меньше или равно аргументу. Вернулся как двойной.

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

Возвращает ближайший long или int, как указано типом возврата метода к аргументу.

Возвращает меньший из двух аргументов.

Возвращает больший из двух аргументов.

Возвращает основание натуральных логарифмов e в силу аргумента.

Возвращает натуральный логарифм аргумента.

Возвращает значение первого аргумента, возведенного в степень второго аргумента.

Возвращает квадратный корень аргумента.

Возвращает синус указанного двойного значения.

Возвращает косинус указанного двойного значения.

Возвращает тангенс указанного двойного значения.

Возвращает арксинус указанного двойного значения.

Возвращает арккозин указанного двойного значения.

Возвращает арктангенс указанного двойного значения.

Преобразует прямоугольные координаты (x, y) в полярные координаты (r, theta) и возвращает theta.

Преобразует аргумент в градусы.

Преобразует аргумент в радианы.

Возвращает случайное число.

Что дальше?

В следующем разделе мы рассмотрим класс Character в Java. Вы узнаете, как использовать объектные символы и примитивный тип данных char в Java.

Java — класс символов

Обычно, когда мы работаем с символами, мы используем примитивные типы данных char.

пример

char ch = 'a';

// Unicode for uppercase Greek omega character
char uniChar = '\u039A'; 

// an array of chars
char[] charArray ={ 'a', 'b', 'c', 'd', 'e' }; 

Однако в процессе разработки мы сталкиваемся с ситуациями, когда нам нужно использовать объекты вместо примитивных типов данных. Для этого Java предоставляет класс-оболочку Character для примитивного типа данных char.

Класс Character предлагает ряд полезных (то есть статических) методов класса для манипулирования символами. Вы можете создать объект Character с помощью конструктора Character —

Character ch = new Character('a');

Компилятор Java также создаст объект Character для вас при некоторых обстоятельствах. Например, если вы передаете примитивный символ в метод, который ожидает объект, компилятор автоматически преобразует символ в символ для вас. Эта функция называется автоматической коробкой или распаковкой, если преобразование идет другим путем.

пример

// Here following primitive char 'a'
// is boxed into the Character object ch
Character ch = 'a';

// Here primitive 'x' is boxed for method test,
// return is unboxed to char 'c'
char c = test('x');

Побег последовательности

Символ, которому предшествует обратная косая черта (\), является escape-последовательностью и имеет особое значение для компилятора.

Символ новой строки (\ n) часто использовался в этом руководстве в инструкциях System.out.println () для перехода на следующую строку после печати строки.

Следующая таблица показывает escape-последовательности Java —

Последовательность побега Описание
\ т Вставляет вкладку в текст в этой точке.
\ б Вставляет клавишу возврата в текст на этом этапе.
\ п Вставляет новую строку в текст в этой точке.
Вставляет возврат каретки в текст в этой точке.
\ е Вставляет ленту новостей в текст на этом этапе.
Вставляет символ одинарной кавычки в текст на этом этапе.
Вставляет в текст знак двойной кавычки.
\\ Вставляет символ обратной косой черты в текст в этой точке.

Когда в операторе печати встречается escape-последовательность, компилятор интерпретирует ее соответствующим образом.

пример

Если вы хотите поместить кавычки в кавычки, вы должны использовать escape-последовательность \ «, во внутренних кавычках —

Live Demo

public class Test {

   public static void main(String args[]) {
      System.out.println("She said \"Hello!\" to me.");
   }
}

Это даст следующий результат —

Выход

She said "Hello!" to me.

Методы персонажа

Ниже приведен список важных методов экземпляров, которые реализуют все подклассы класса Character.

Sr.No. Метод и описание
1 isLetter ()

Определяет, является ли указанное значение символа буквой.

2 isDigit ()

Определяет, является ли указанное значение символа цифрой.

3 isWhitespace ()

Определяет, является ли указанное значение символа пустым пространством.

4 isUpperCase ()

Определяет, является ли указанное значение символа заглавными.

5 isLowerCase ()

Определяет, является ли указанное значение символа строчными.

6 toUpperCase ()

Возвращает заглавную форму указанного значения символа.

7 toLowerCase ()

Возвращает строчную форму указанного значения символа.

8 нанизывать()

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

Определяет, является ли указанное значение символа буквой.

Определяет, является ли указанное значение символа цифрой.

Определяет, является ли указанное значение символа пустым пространством.

Определяет, является ли указанное значение символа заглавными.

Определяет, является ли указанное значение символа строчными.

Возвращает заглавную форму указанного значения символа.

Возвращает строчную форму указанного значения символа.

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

Полный список методов см. В спецификации API java.lang.Character.

Что дальше?

В следующем разделе мы рассмотрим класс String в Java. Вы узнаете, как эффективно объявлять и использовать Strings, а также некоторые важные методы в классе String.

Java — класс строк

Строки, которые широко используются в Java-программировании, представляют собой последовательность символов. В языке программирования Java строки рассматриваются как объекты.

Платформа Java предоставляет класс String для создания и управления строками.

Создание строк

Самый прямой способ создать строку — написать

String greeting = "Hello world!";

Всякий раз, когда он встречает строковый литерал в вашем коде, компилятор создает объект String со значением в этом случае «Hello world!».

Как и с любым другим объектом, вы можете создавать объекты String, используя ключевое слово new и конструктор. Класс String имеет 11 конструкторов, которые позволяют указывать начальное значение строки с использованием различных источников, таких как массив символов.

пример

Live Demo

public class StringDemo {

   public static void main(String args[]) {
      char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.' };
      String helloString = new String(helloArray);  
      System.out.println( helloString );
   }
}

Это даст следующий результат —

Выход

hello.

Примечание. Класс String является неизменным, поэтому после его создания объект String нельзя изменить. Если необходимо внести много изменений в строки символов, вам следует использовать классы String Buffer и String Builder .

Длина строки

Методы, используемые для получения информации об объекте, называются методами доступа . Одним из методов доступа, который вы можете использовать со строками, является метод length (), который возвращает количество символов, содержащихся в строковом объекте.

Следующая программа является примером length () , метод класса String.

пример

Live Demo

public class StringDemo {

   public static void main(String args[]) {
      String palindrome = "Dot saw I was Tod";
      int len = palindrome.length();
      System.out.println( "String Length is : " + len );
   }
}

Это даст следующий результат —

Выход

String Length is : 17

Конкатенация строк

Класс String включает метод для объединения двух строк:

string1.concat(string2);

Это возвращает новую строку, которая является строкой1 с добавленной строкой2 в конце. Вы также можете использовать метод concat () со строковыми литералами, как в —

"My name is ".concat("Zara");

Строки чаще объединяются с помощью оператора +, как в —

"Hello," + " world" + "!"

что приводит к —

"Hello, world!"

Давайте посмотрим на следующий пример —

пример

Live Demo

public class StringDemo {

   public static void main(String args[]) {
      String string1 = "saw I was ";
      System.out.println("Dot " + string1 + "Tod");
   }
}

Это даст следующий результат —

Выход

Dot saw I was Tod

Создание форматных строк

У вас есть методы printf () и format () для печати вывода с отформатированными числами. Класс String имеет эквивалентный метод класса format (), который возвращает объект String, а не объект PrintStream.

Использование статического метода format () в String позволяет создать отформатированную строку, которую можно использовать повторно, в отличие от одноразового оператора печати. Например, вместо —

пример

System.out.printf("The value of the float variable is " +
                  "%f, while the value of the integer " +
                  "variable is %d, and the string " +
                  "is %s", floatVar, intVar, stringVar);

Вы можете написать —

String fs;
fs = String.format("The value of the float variable is " +
                   "%f, while the value of the integer " +
                   "variable is %d, and the string " +
                   "is %s", floatVar, intVar, stringVar);
System.out.println(fs);

Строковые Методы

Вот список методов, поддерживаемых классом String —

Sr.No. Метод и описание
1 char charAt (int index)

Возвращает символ по указанному индексу.

2 int CompareTo (Объект o)

Сравнивает эту строку с другим объектом.

3 int compareTo (String anotherString)

Сравнивает две строки лексикографически.

4 int compareToIgnoreCase (String str)

Сравнивает две строки лексикографически, игнорируя различия в регистре.

5 Строка Конкат (String str)

Объединяет указанную строку до конца этой строки.

6 логическое contentEquals (StringBuffer sb)

Возвращает true тогда и только тогда, когда эта String представляет ту же последовательность символов, что и указанный StringBuffer.

7 static String copyValueOf (char [] data)

Возвращает строку, представляющую последовательность символов в указанном массиве.

8 static String copyValueOf (данные char [], смещение int, число int)

Возвращает строку, представляющую последовательность символов в указанном массиве.

9 логическое заканчивается с (суффикс строки)

Проверяет, заканчивается ли эта строка указанным суффиксом.

10 логическое равенство (Object anObject)

Сравнивает эту строку с указанным объектом.

11 логическое equalsIgnoreCase (String anotherString)

Сравнивает эту строку с другой строкой, игнорируя соображения регистра.

12 byte getBytes ()

Кодирует эту строку в последовательность байтов, используя кодировку платформы по умолчанию, сохраняя результат в новом байтовом массиве.

13 byte [] getBytes (String charsetName)

Кодирует эту строку в последовательность байтов, используя именованную кодировку, сохраняя результат в новом байтовом массиве.

14 void getChars (int srcBegin, int srcEnd, char [] dst, int dstBegin)

Копирует символы из этой строки в массив символов назначения.

15 int hashCode ()

Возвращает хеш-код для этой строки.

16 int indexOf (int ch)

Возвращает индекс в этой строке первого вхождения указанного символа.

17 int indexOf (int ch, int fromIndex)

Возвращает индекс в этой строке первого вхождения указанного символа, начиная поиск по указанному индексу.

18 int indexOf (String str)

Возвращает индекс в этой строке первого вхождения указанной подстроки.

19 int indexOf (String str, int fromIndex)

Возвращает индекс в этой строке первого вхождения указанной подстроки, начиная с указанного индекса.

20 Строка интерна ()

Возвращает каноническое представление для строкового объекта.

21 int lastIndexOf (int ch)

Возвращает индекс в этой строке последнего вхождения указанного символа.

22 int lastIndexOf (int ch, int fromIndex)

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

23 int lastIndexOf (String str)

Возвращает индекс в этой строке самого правого вхождения указанной подстроки.

24 int lastIndexOf (String str, int fromIndex)

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

25 int length ()

Возвращает длину этой строки.

26 булевы совпадения (строковое регулярное выражение)

Сообщает, соответствует ли эта строка заданному регулярному выражению.

27 логическое regionMatches (логическое ignoreCase, int toffset, String other, int ooffset, int len)

Проверяет, равны ли две строковые области.

28 логическое regionMatches (int toffset, String other, int ooffset, int len)

Проверяет, равны ли две строковые области.

29 Замена строки (char oldChar, char newChar)

Возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на newChar.

30 String replaceAll (регулярное выражение строки, замена строки

Заменяет каждую подстроку этой строки, которая соответствует данному регулярному выражению с данной заменой.

31 String replaceFirst (регулярное выражение строки, замена строки)

Заменяет первую подстроку этой строки, которая соответствует заданному регулярному выражению с заданной заменой.

32 String [] split (регулярное выражение строки)

Разбивает эту строку вокруг совпадений заданного регулярного выражения.

33 String [] split (регулярное выражение String, ограничение int)

Разбивает эту строку вокруг совпадений заданного регулярного выражения.

34 логическое начальное с (строковый префикс)

Проверяет, начинается ли эта строка с указанного префикса.

35 логическое начальное с (строковый префикс, int toffset)

Проверяет, начинается ли эта строка с указанного префикса, начиная с указанного индекса.

36 Подпоследовательность CharSequence (int beginIndex, int endIndex)

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

37 Строковая подстрока (int beginIndex)

Возвращает новую строку, которая является подстрокой этой строки.

38 Строковая подстрока (int beginIndex, int endIndex)

Возвращает новую строку, которая является подстрокой этой строки.

39 char [] toCharArray ()

Преобразует эту строку в новый массив символов.

40 Строка toLowerCase ()

Преобразует все символы в этой строке в нижний регистр, используя правила локали по умолчанию.

41 String toLowerCase (языковой стандарт)

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

42 Строка toString ()

Этот объект (который уже является строкой!) Сам по себе возвращается.

43 Строка toUpperCase ()

Преобразует все символы в этой строке в верхний регистр, используя правила локали по умолчанию.

44 String toUpperCase (языковой стандарт)

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

45 Струнная отделка ()

Возвращает копию строки, пропуская начальные и конечные пробелы.

46 static String valueOf (примитивный тип данных x)

Возвращает строковое представление переданного аргумента типа данных.

Возвращает символ по указанному индексу.

Сравнивает эту строку с другим объектом.

Сравнивает две строки лексикографически.

Сравнивает две строки лексикографически, игнорируя различия в регистре.

Объединяет указанную строку до конца этой строки.

Возвращает true тогда и только тогда, когда эта String представляет ту же последовательность символов, что и указанный StringBuffer.

Возвращает строку, представляющую последовательность символов в указанном массиве.

Возвращает строку, представляющую последовательность символов в указанном массиве.

Проверяет, заканчивается ли эта строка указанным суффиксом.

Сравнивает эту строку с указанным объектом.

Сравнивает эту строку с другой строкой, игнорируя соображения регистра.

Кодирует эту строку в последовательность байтов, используя кодировку платформы по умолчанию, сохраняя результат в новом байтовом массиве.

Кодирует эту строку в последовательность байтов, используя именованную кодировку, сохраняя результат в новом байтовом массиве.

Копирует символы из этой строки в массив символов назначения.

Возвращает хеш-код для этой строки.

Возвращает индекс в этой строке первого вхождения указанного символа.

Возвращает индекс в этой строке первого вхождения указанного символа, начиная поиск по указанному индексу.

Возвращает индекс в этой строке первого вхождения указанной подстроки.

Возвращает индекс в этой строке первого вхождения указанной подстроки, начиная с указанного индекса.

Возвращает каноническое представление для строкового объекта.

Возвращает индекс в этой строке последнего вхождения указанного символа.

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

Возвращает индекс в этой строке самого правого вхождения указанной подстроки.

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

Возвращает длину этой строки.

Сообщает, соответствует ли эта строка заданному регулярному выражению.

Проверяет, равны ли две строковые области.

Проверяет, равны ли две строковые области.

Возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на newChar.

Заменяет каждую подстроку этой строки, которая соответствует данному регулярному выражению с данной заменой.

Заменяет первую подстроку этой строки, которая соответствует заданному регулярному выражению с заданной заменой.

Разбивает эту строку вокруг совпадений заданного регулярного выражения.

Разбивает эту строку вокруг совпадений заданного регулярного выражения.

Проверяет, начинается ли эта строка с указанного префикса.

Проверяет, начинается ли эта строка с указанного префикса, начиная с указанного индекса.

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

Возвращает новую строку, которая является подстрокой этой строки.

Возвращает новую строку, которая является подстрокой этой строки.

Преобразует эту строку в новый массив символов.

Преобразует все символы в этой строке в нижний регистр, используя правила локали по умолчанию.

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

Этот объект (который уже является строкой!) Сам по себе возвращается.

Преобразует все символы в этой строке в верхний регистр, используя правила локали по умолчанию.

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

Возвращает копию строки, пропуская начальные и конечные пробелы.

Возвращает строковое представление переданного аргумента типа данных.

Java — Массивы

Java предоставляет структуру данных, массив , в котором хранится последовательная коллекция фиксированного размера элементов одного типа. Массив используется для хранения коллекции данных, но часто более полезно думать о массиве как о коллекции переменных одного типа.

Вместо того, чтобы объявлять отдельные переменные, такие как number0, number1, … и number99, вы объявляете одну переменную массива, такую ​​как числа, и используете числа [0], числа [1] и …, числа [99] для представления отдельные переменные.

В этом руководстве рассказывается, как объявлять переменные массива, создавать массивы и обрабатывать массивы с использованием индексированных переменных.

Объявление переменных массива

Чтобы использовать массив в программе, необходимо объявить переменную для ссылки на массив и указать тип массива, на который может ссылаться переменная. Вот синтаксис для объявления переменной массива —

Синтаксис

dataType[] arrayRefVar;   // preferred way.
or
dataType arrayRefVar[];  // works but not preferred way.

Примечание . Стиль dataType [] arrayRefVar является предпочтительным. Стиль dataType arrayRefVar [] происходит от языка C / C ++ и был принят в Java для поддержки программистов на C / C ++.

пример

Следующие фрагменты кода являются примерами этого синтаксиса —

double[] myList;   // preferred way.
or
double myList[];   // works but not preferred way.

Создание массивов

Вы можете создать массив, используя оператор new со следующим синтаксисом:

Синтаксис

arrayRefVar = new dataType[arraySize];

Вышеупомянутое утверждение делает две вещи —

  • Он создает массив, используя новый dataType [arraySize].

  • Он присваивает ссылку на вновь созданный массив переменной arrayRefVar.

Он создает массив, используя новый dataType [arraySize].

Он присваивает ссылку на вновь созданный массив переменной arrayRefVar.

Объявление переменной массива, создание массива и присвоение ссылки на массив переменной можно объединить в одном выражении, как показано ниже:

dataType[] arrayRefVar = new dataType[arraySize];

В качестве альтернативы вы можете создать массивы следующим образом —

dataType[] arrayRefVar = {value0, value1, ..., valuek};

Доступ к элементам массива осуществляется через индекс . Индексы массива основаны на 0; то есть они начинаются с 0 до arrayRefVar.length-1 .

пример

Следующий оператор объявляет переменную массива myList, создает массив из 10 элементов двойного типа и присваивает его ссылку на myList —

double[] myList = new double[10];

Следующая картинка представляет массив myList. Здесь myList содержит десять двойных значений и индексы от 0 до 9.

Java Array

Обработка массивов

При обработке элементов массива мы часто используем цикл for или цикл foreach, поскольку все элементы в массиве относятся к одному типу, а размер массива известен.

пример

Вот полный пример, показывающий, как создавать, инициализировать и обрабатывать массивы —

Live Demo

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList[i] + " ");
      }
     
      // Summing all elements
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList[i];
      }
      System.out.println("Total is " + total);
      
      // Finding the largest element
      double max = myList[0];
      for (int i = 1; i < myList.length; i++) {
         if (myList[i] > max) max = myList[i];
      }
      System.out.println("Max is " + max);  
   }
}

Это даст следующий результат —

Выход

1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5

Петли foreach

В JDK 1.5 появился новый цикл for, известный как цикл foreach или расширенный цикл for, который позволяет последовательно обходить весь массив без использования индексной переменной.

пример

Следующий код отображает все элементы в массиве myList —

Live Demo

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (double element: myList) {
         System.out.println(element);
      }
   }
}

Это даст следующий результат —

Выход

1.9
2.9
3.4
3.5

Передача массивов в методы

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

пример

public static void printArray(int[] array) {
   for (int i = 0; i < array.length; i++) {
      System.out.print(array[i] + " ");
   }
}

Вы можете вызвать его, передав массив. Например, следующий оператор вызывает метод printArray для отображения 3, 1, 2, 6, 4 и 2 —

пример

printArray(new int[]{3, 1, 2, 6, 4, 2});

Возвращение массива из метода

Метод также может возвращать массив. Например, следующий метод возвращает массив, который является обращением другого массива —

пример

public static int[] reverse(int[] list) {
   int[] result = new int[list.length];

   for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
      result[j] = list[i];
   }
   return result;
}

Класс Массивов

Класс java.util.Arrays содержит различные статические методы для сортировки и поиска в массивах, сравнения массивов и заполнения элементов массива. Эти методы перегружены для всех примитивных типов.

Sr.No. Метод и описание
1

public static int binarySearch (Object [] a, Ключ объекта)

Выполняет поиск в указанном массиве Object (Byte, Int, double и т. Д.) Указанного значения с использованием алгоритма двоичного поиска. Массив должен быть отсортирован до выполнения этого вызова. Возвращает индекс ключа поиска, если он содержится в списке; в противном случае возвращается (- (точка вставки + 1)).

2

public static логическое equals (long [] a, long [] a2)

Возвращает true, если два указанных массива long равны друг другу. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары элементов в двух массивах равны. Это возвращает истину, если два массива равны. Тот же метод может использоваться всеми другими примитивными типами данных (Byte, short, Int и т. Д.)

3

public static void fill (int [] a, int val)

Назначает указанное значение int каждому элементу указанного массива целых. Тот же метод может использоваться всеми другими примитивными типами данных (Byte, short, Int и т. Д.)

4

общедоступная статическая сортировка void (Object [] a)

Сортирует указанный массив объектов в порядке возрастания в соответствии с естественным порядком его элементов. Тот же метод может использоваться всеми другими примитивными типами данных (Byte, short, Int и т. Д.)

public static int binarySearch (Object [] a, Ключ объекта)

Выполняет поиск в указанном массиве Object (Byte, Int, double и т. Д.) Указанного значения с использованием алгоритма двоичного поиска. Массив должен быть отсортирован до выполнения этого вызова. Возвращает индекс ключа поиска, если он содержится в списке; в противном случае возвращается (- (точка вставки + 1)).

public static логическое equals (long [] a, long [] a2)

Возвращает true, если два указанных массива long равны друг другу. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, и все соответствующие пары элементов в двух массивах равны. Это возвращает истину, если два массива равны. Тот же метод может использоваться всеми другими примитивными типами данных (Byte, short, Int и т. Д.)

public static void fill (int [] a, int val)

Назначает указанное значение int каждому элементу указанного массива целых. Тот же метод может использоваться всеми другими примитивными типами данных (Byte, short, Int и т. Д.)

общедоступная статическая сортировка void (Object [] a)

Сортирует указанный массив объектов в порядке возрастания в соответствии с естественным порядком его элементов. Тот же метод может использоваться всеми другими примитивными типами данных (Byte, short, Int и т. Д.)

Java — дата и время

Java предоставляет класс Date, доступный в пакете java.util , этот класс инкапсулирует текущую дату и время.

Класс Date поддерживает два конструктора, как показано в следующей таблице.

Sr.No. Конструктор и описание
1

Дата( )

Этот конструктор инициализирует объект с текущей датой и временем.

2

Дата (длинный миллисек)

Этот конструктор принимает аргумент, равный количеству миллисекунд, прошедших с полуночи 1 января 1970 года.

Дата( )

Этот конструктор инициализирует объект с текущей датой и временем.

Дата (длинный миллисек)

Этот конструктор принимает аргумент, равный количеству миллисекунд, прошедших с полуночи 1 января 1970 года.

Ниже приведены методы класса даты.

Sr.No. Метод и описание
1

логическое после (Дата дата)

Возвращает true, если вызывающий объект Date содержит дату, которая позже даты, указанной в date, в противном случае он возвращает false.

2

логическое значение до (дата дата)

Возвращает true, если вызывающий объект Date содержит дату, более раннюю, чем та, которая указана в date, в противном случае он возвращает false.

3

Клон объекта ()

Дублирует вызывающий объект Date.

4

int compareTo (Дата дата)

Сравнивает значение вызывающего объекта со значением даты. Возвращает 0, если значения равны. Возвращает отрицательное значение, если вызывающий объект раньше даты. Возвращает положительное значение, если вызывающий объект позже даты.

5

int compareTo (Object obj)

Действует одинаково для compareTo (Date), если obj имеет класс Date. В противном случае он создает исключение ClassCastException.

6

логическое равенство (дата объекта)

Возвращает true, если вызывающий объект Date содержит то же время и дату, что и объект, указанный в date, в противном случае он возвращает false.

7

long getTime ()

Возвращает количество миллисекунд, прошедших с 1 января 1970 года.

8

int hashCode ()

Возвращает хеш-код для вызывающего объекта.

9

void setTime (долгое время)

Устанавливает время и дату, указанные по времени, которое представляет истекшее время в миллисекундах с полуночи 1 января 1970 года.

10

Строка toString ()

Преобразует вызывающий объект Date в строку и возвращает результат.

логическое после (Дата дата)

Возвращает true, если вызывающий объект Date содержит дату, которая позже даты, указанной в date, в противном случае он возвращает false.

логическое значение до (дата дата)

Возвращает true, если вызывающий объект Date содержит дату, более раннюю, чем та, которая указана в date, в противном случае он возвращает false.

Клон объекта ()

Дублирует вызывающий объект Date.

int compareTo (Дата дата)

Сравнивает значение вызывающего объекта со значением даты. Возвращает 0, если значения равны. Возвращает отрицательное значение, если вызывающий объект раньше даты. Возвращает положительное значение, если вызывающий объект позже даты.

int compareTo (Object obj)

Действует одинаково для compareTo (Date), если obj имеет класс Date. В противном случае он создает исключение ClassCastException.

логическое равенство (дата объекта)

Возвращает true, если вызывающий объект Date содержит то же время и дату, что и объект, указанный в date, в противном случае он возвращает false.

long getTime ()

Возвращает количество миллисекунд, прошедших с 1 января 1970 года.

int hashCode ()

Возвращает хеш-код для вызывающего объекта.

void setTime (долгое время)

Устанавливает время и дату, указанные по времени, которое представляет истекшее время в миллисекундах с полуночи 1 января 1970 года.

Строка toString ()

Преобразует вызывающий объект Date в строку и возвращает результат.

Получение текущей даты и времени

Это очень простой способ получить текущую дату и время в Java. Вы можете использовать простой объект Date с методом toString () для печати текущей даты и времени следующим образом:

пример

Live Demo

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date using toString()
      System.out.println(date.toString());
   }
}

Это даст следующий результат —

Выход

on May 04 09:51:52 CDT 2009

Сравнение дат

Ниже приведены три способа сравнить две даты:

  • Вы можете использовать getTime (), чтобы получить количество миллисекунд, прошедших с полуночи 1 января 1970 года, для обоих объектов, а затем сравнить эти два значения.

  • Вы можете использовать методы before (), after () и equals (). Поскольку 12-е число месяца предшествует 18-му, например, новая Дата (99, 2, 12) .before (новая Дата (99, 2, 18)) возвращает true.

  • Вы можете использовать метод compareTo (), который определяется интерфейсом Comparable и реализуется датой.

Вы можете использовать getTime (), чтобы получить количество миллисекунд, прошедших с полуночи 1 января 1970 года, для обоих объектов, а затем сравнить эти два значения.

Вы можете использовать методы before (), after () и equals (). Поскольку 12-е число месяца предшествует 18-му, например, новая Дата (99, 2, 12) .before (новая Дата (99, 2, 18)) возвращает true.

Вы можете использовать метод compareTo (), который определяется интерфейсом Comparable и реализуется датой.

Форматирование даты с использованием SimpleDateFormat

SimpleDateFormat — это конкретный класс для форматирования и анализа дат с учетом языка. SimpleDateFormat позволяет начать с выбора любых пользовательских шаблонов для форматирования даты и времени.

пример

Live Demo

import java.util.*;
import java.text.*;

public class DateDemo {

   public static void main(String args[]) {
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

      System.out.println("Current Date: " + ft.format(dNow));
   }
}

Это даст следующий результат —

Выход

Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

Простые коды формата DateFormat

Чтобы указать формат времени, используйте строку шаблона времени. В этом шаблоне все буквы ASCII зарезервированы как буквы шаблона, которые определены следующим образом:

символ Описание пример
г Обозначение эпохи ОБЪЯВЛЕНИЕ
Y Год в четыре цифры 2001
M Месяц в году Июль или 07
d День в месяце 10
час Час в AM / PM (1 ~ 12) 12
ЧАС Час в день (0 ~ 23) 22
м Минута в час 30
s Секунда в минуту 55
S миллисекунды 234
Е День в неделю вторник
D День в году 360
F День недели в месяце 2 (вторая среда в июле)
вес Неделя в году 40
W Неделя в месяце 1
AM / PM маркер ВЕЧЕРА
К Час в день (1 ~ 24) 24
К Час в AM / PM (0 ~ 11) 10
Z Часовой пояс Восточное стандартное время
Побег для текста Разделитель
« Одинарные цитаты `

Форматирование даты с использованием printf

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

пример

Live Demo

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date
      String str = String.format("Current Date/Time : %tc", date );

      System.out.printf(str);
   }
}

Это даст следующий результат —

Выход

Current Date/Time : Sat Dec 15 16:37:57 MST 2012

Было бы немного глупо, если бы вам приходилось указывать дату несколько раз для форматирования каждой части. По этой причине строка формата может указывать индекс аргумента для форматирования.

Индекс должен следовать сразу за%, и он должен заканчиваться на $.

пример

Live Demo

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display time and date
      System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
   }
}

Это даст следующий результат —

Выход

Due date: February 09, 2004

Кроме того, вы можете использовать флаг <. Это указывает на то, что тот же аргумент, что и в предыдущей спецификации формата, должен использоваться снова.

пример

Live Demo

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display formatted date
      System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
   }
}

Это даст следующий результат —

Выход

Due date: February 09, 2004

Символы преобразования даты и времени

символ Описание пример
с Полная дата и время Пн Май 04 09:51:52 CDT 2009
F Дата ISO 8601 2004-02-09
D Дата в США (месяц / день / год) 02/09/2004
T 24-часовое время 18:05:19
р 12 часов 06:05:19
р 24 часа, без секунд 18:05
Y Четырехзначный год (с ведущими нулями) 2004
Y Последние две цифры года (с ведущими нулями) 04
С Первые две цифры года (с ведущими нулями) 20
В Полное название месяца февраль
б Сокращенное название месяца февраль
м Двузначный месяц (с ведущими нулями) 02
d Двузначный день (с ведущими нулями) 03
е Двузначный день (без начальных нулей) 9
Полное название дня недели понедельник
Сокращенное название дня недели понедельник
J Трехзначный день года (с ведущими нулями) 069
ЧАС Двузначный час (с ведущими нулями), между 00 и 23 18
К Двузначный час (без начальных нулей), от 0 до 23 18
я Двузначный час (с ведущими нулями), между 01 и 12 06
L Двузначный час (без начальных нулей), от 1 до 12 6
M Двузначные минуты (с ведущими нулями) 05
S Двузначные секунды (с ведущими нулями) 19
L Трехзначные миллисекунды (с ведущими нулями) 047
N Девятизначные наносекунды (с ведущими нулями) 047000000
п Прописные метки утром или днем ВЕЧЕРА
п Строчный маркер утром или днем вечера
Z RFC 822 числовое смещение от GMT -0800
Z Часовой пояс Тихоокеанское стандартное время
s Секунды с 1970-01-01 00:00:00 по Гринвичу 1078884319
Q Миллисекунды с 1970-01-01 00:00:00 по Гринвичу 1078884319047

Есть и другие полезные классы, связанные с датой и временем. Для получения более подробной информации вы можете обратиться к документации по стандарту Java.

Разбор строк в даты

Класс SimpleDateFormat имеет несколько дополнительных методов, в частности parse (), который пытается проанализировать строку в соответствии с форматом, хранящимся в данном объекте SimpleDateFormat.

пример

Live Demo

import java.util.*;
import java.text.*;
  
public class DateDemo {

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
      String input = args.length == 0 ? "1818-11-11" : args[0]; 

      System.out.print(input + " Parses as "); 
      Date t;
      try {
         t = ft.parse(input); 
         System.out.println(t); 
      } catch (ParseException e) { 
         System.out.println("Unparseable using " + ft); 
      }
   }
}

Пример запуска вышеуказанной программы даст следующий результат:

Выход

1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818

Спать какое-то время

Вы можете спать в течение любого периода времени от одной миллисекунды до времени жизни вашего компьютера. Например, следующая программа будет спать в течение 3 секунд —

пример

Live Demo

import java.util.*;
public class SleepDemo {

   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) {
         System.out.println("Got an exception!"); 
      }
   }
}

Это даст следующий результат —

Выход

Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009

Измерение прошедшего времени

Иногда вам может потребоваться измерить момент времени в миллисекундах. Итак, давайте перепишем приведенный выше пример еще раз —

пример

Live Demo

import java.util.*;
public class DiffDemo {

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}

Это даст следующий результат —

Выход

Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:57 GMT 2009
Difference is : 5993

Класс GregorianCalendar

GregorianCalendar — это конкретная реализация класса Calendar, которая реализует обычный григорианский календарь, с которым вы знакомы. Мы не обсуждали класс Calendar в этом уроке, вы можете посмотреть стандартную документацию по Java для этого.

Метод getInstance () класса Calendar возвращает GregorianCalendar, инициализированный с текущей датой и временем в локали и часовом поясе по умолчанию. GregorianCalendar определяет два поля: AD и BC. Они представляют две эпохи, определенные григорианским календарем.

Есть также несколько конструкторов для объектов GregorianCalendar —

Sr.No. Конструктор и описание
1

Григорианский календарь()

Создает по умолчанию GregorianCalendar, используя текущее время в часовом поясе по умолчанию и локаль по умолчанию.

2

GregorianCalendar (int год, int месяц, int дата)

Создает GregorianCalendar с заданной датой, установленной в часовом поясе по умолчанию с локалью по умолчанию.

3

GregorianCalendar (int год, int месяц, int дата, int час, int минута)

Создает GregorianCalendar с заданной датой и временем, установленными для часового пояса по умолчанию с языковым стандартом по умолчанию.

4

GregorianCalendar (int год, int месяц, int дата, int час, int минута, int секунда)

Создает GregorianCalendar с заданной датой и временем, установленными для часового пояса по умолчанию с языковым стандартом по умолчанию.

5

GregorianCalendar (Locale aLocale)

Создает GregorianCalendar на основе текущего времени в часовом поясе по умолчанию с заданным языковым стандартом.

6

GregorianCalendar (часовой пояс)

Создает GregorianCalendar на основе текущего времени в заданном часовом поясе с языковым стандартом по умолчанию.

7

GregorianCalendar (часовой пояс, локаль и локаль)

Создает GregorianCalendar на основе текущего времени в заданном часовом поясе с заданным языковым стандартом.

Григорианский календарь()

Создает по умолчанию GregorianCalendar, используя текущее время в часовом поясе по умолчанию и локаль по умолчанию.

GregorianCalendar (int год, int месяц, int дата)

Создает GregorianCalendar с заданной датой, установленной в часовом поясе по умолчанию с локалью по умолчанию.

GregorianCalendar (int год, int месяц, int дата, int час, int минута)

Создает GregorianCalendar с заданной датой и временем, установленными для часового пояса по умолчанию с языковым стандартом по умолчанию.

GregorianCalendar (int год, int месяц, int дата, int час, int минута, int секунда)

Создает GregorianCalendar с заданной датой и временем, установленными для часового пояса по умолчанию с языковым стандартом по умолчанию.

GregorianCalendar (Locale aLocale)

Создает GregorianCalendar на основе текущего времени в часовом поясе по умолчанию с заданным языковым стандартом.

GregorianCalendar (часовой пояс)

Создает GregorianCalendar на основе текущего времени в заданном часовом поясе с языковым стандартом по умолчанию.

GregorianCalendar (часовой пояс, локаль и локаль)

Создает GregorianCalendar на основе текущего времени в заданном часовом поясе с заданным языковым стандартом.

Вот список нескольких полезных методов поддержки, предоставляемых классом GregorianCalendar —

Sr.No. Метод и описание
1

void add (поле int, значение int)

Добавляет указанное (подписанное) количество времени к указанному полю времени на основе правил календаря.

2

защищенный void computeFields ()

Преобразует UTC в миллисекундах в значения поля времени.

3

защищенный void computeTime ()

Календарь переопределений Преобразует значения поля времени в UTC в миллисекундах.

4

логическое равенство (Object obj)

Сравнивает этот GregorianCalendar со ссылкой на объект.

5

int get (int field)

Получает значение для данного временного поля.

6

int getActualMaximum (int field)

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

7

int getActualMinimum (int field)

Возвращает минимальное значение, которое может иметь это поле, учитывая текущую дату.

8

int getGreatestMinimum (int field)

Возвращает максимальное минимальное значение для данного поля, если оно варьируется.

9

Дата getGregorianChange ()

Получает дату изменения григорианского календаря.

10

int getLeastMaximum (int field)

Возвращает самое низкое максимальное значение для данного поля, если изменяется.

11

int getMaximum (int field)

Возвращает максимальное значение для данного поля.

12

Дата getTime ()

Получает текущее время этого календаря.

13

long getTimeInMillis ()

Получает текущее время этого Календаря как long.

14

TimeZone getTimeZone ()

Получает часовой пояс.

15

int getMinimum (int field)

Возвращает минимальное значение для данного поля.

16

int hashCode ()

Переопределяет hashCode.

17

логическое значение isLeapYear (int year)

Определяет, является ли данный год високосным.

18

void roll (int field, boolean up)

Добавляет или вычитает (вверх / вниз) одну единицу времени в данном поле времени без изменения больших полей.

19

void set (int field, int value)

Устанавливает поле времени с заданным значением.

20

недействительный набор (int year, int month, int date)

Устанавливает значения для полей год, месяц и дата.

21

void set (int год, int месяц, int дата, int час, int минута)

Устанавливает значения для полей год, месяц, дата, час и минута.

22

void set (int год, int месяц, int дата, int час, int минута, int секунда)

Устанавливает значения для полей год, месяц, дата, час, минута и секунда.

23

void setGregorianChange (Дата дата)

Устанавливает дату изменения GregorianCalendar.

24

void setTime (Дата, дата)

Устанавливает текущее время этого календаря с заданной датой.

25

void setTimeInMillis (длинный миллис)

Устанавливает текущее время этого календаря из заданного длинного значения.

26

void setTimeZone (значение TimeZone)

Устанавливает часовой пояс с заданным значением часового пояса.

27

Строка toString ()

Возвращает строковое представление этого календаря.

void add (поле int, значение int)

Добавляет указанное (подписанное) количество времени к указанному полю времени на основе правил календаря.

защищенный void computeFields ()

Преобразует UTC в миллисекундах в значения поля времени.

защищенный void computeTime ()

Календарь переопределений Преобразует значения поля времени в UTC в миллисекундах.

логическое равенство (Object obj)

Сравнивает этот GregorianCalendar со ссылкой на объект.

int get (int field)

Получает значение для данного временного поля.

int getActualMaximum (int field)

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

int getActualMinimum (int field)

Возвращает минимальное значение, которое может иметь это поле, учитывая текущую дату.

int getGreatestMinimum (int field)

Возвращает максимальное минимальное значение для данного поля, если оно варьируется.

Дата getGregorianChange ()

Получает дату изменения григорианского календаря.

int getLeastMaximum (int field)

Возвращает самое низкое максимальное значение для данного поля, если изменяется.

int getMaximum (int field)

Возвращает максимальное значение для данного поля.

Дата getTime ()

Получает текущее время этого календаря.

long getTimeInMillis ()

Получает текущее время этого Календаря как long.

TimeZone getTimeZone ()

Получает часовой пояс.

int getMinimum (int field)

Возвращает минимальное значение для данного поля.

int hashCode ()

Переопределяет hashCode.

логическое значение isLeapYear (int year)

Определяет, является ли данный год високосным.

void roll (int field, boolean up)

Добавляет или вычитает (вверх / вниз) одну единицу времени в данном поле времени без изменения больших полей.

void set (int field, int value)

Устанавливает поле времени с заданным значением.

недействительный набор (int year, int month, int date)

Устанавливает значения для полей год, месяц и дата.

void set (int год, int месяц, int дата, int час, int минута)

Устанавливает значения для полей год, месяц, дата, час и минута.

void set (int год, int месяц, int дата, int час, int минута, int секунда)

Устанавливает значения для полей год, месяц, дата, час, минута и секунда.

void setGregorianChange (Дата дата)

Устанавливает дату изменения GregorianCalendar.

void setTime (Дата, дата)

Устанавливает текущее время этого календаря с заданной датой.

void setTimeInMillis (длинный миллис)

Устанавливает текущее время этого календаря из заданного длинного значения.

void setTimeZone (значение TimeZone)

Устанавливает часовой пояс с заданным значением часового пояса.

Строка toString ()

Возвращает строковое представление этого календаря.

пример

Live Demo

import java.util.*;
public class GregorianCalendarDemo {

   public static void main(String args[]) {
      String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", 
         "Oct", "Nov", "Dec"};
      
      int year;
      // Create a Gregorian calendar initialized
      // with the current date and time in the
      // default locale and timezone.
      
      GregorianCalendar gcalendar = new GregorianCalendar();
      
      // Display current time and date information.
      System.out.print("Date: ");
      System.out.print(months[gcalendar.get(Calendar.MONTH)]);
      System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
      System.out.println(year = gcalendar.get(Calendar.YEAR));
      System.out.print("Time: ");
      System.out.print(gcalendar.get(Calendar.HOUR) + ":");
      System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
      System.out.println(gcalendar.get(Calendar.SECOND));

      // Test if the current year is a leap year
      if(gcalendar.isLeapYear(year)) {
         System.out.println("The current year is a leap year");
      }else {
         System.out.println("The current year is not a leap year");
      }
   }
}

Это даст следующий результат —

Выход

Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year

Полный список констант, доступных в классе Calendar, вы можете найти в стандартной документации Java.

Java — регулярные выражения

Java предоставляет пакет java.util.regex для сопоставления с шаблоном с регулярными выражениями. Регулярные выражения Java очень похожи на язык программирования Perl и очень просты в освоении.

Регулярное выражение — это специальная последовательность символов, которая помогает вам сопоставлять или находить другие строки или наборы строк, используя специальный синтаксис, содержащийся в шаблоне. Их можно использовать для поиска, редактирования или манипулирования текстом и данными.

Пакет java.util.regex в основном состоит из следующих трех классов:

  • Класс Pattern — Объект Pattern представляет собой скомпилированное представление регулярного выражения. Класс Pattern не предоставляет общедоступных конструкторов. Чтобы создать шаблон, вы должны сначала вызвать один из его открытых статических методов compile () , который затем вернет объект Pattern. Эти методы принимают регулярное выражение в качестве первого аргумента.

  • Класс Matcher — объект Matcher — это механизм, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и класс Pattern, Matcher не определяет общедоступных конструкторов. Вы получаете объект Matcher, вызывая метод matcher () для объекта Pattern.

  • PatternSyntaxException — Объект PatternSyntaxException является непроверенным исключением, которое указывает на синтаксическую ошибку в образце регулярного выражения.

Класс Pattern — Объект Pattern представляет собой скомпилированное представление регулярного выражения. Класс Pattern не предоставляет общедоступных конструкторов. Чтобы создать шаблон, вы должны сначала вызвать один из его открытых статических методов compile () , который затем вернет объект Pattern. Эти методы принимают регулярное выражение в качестве первого аргумента.

Класс Matcher — объект Matcher — это механизм, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и класс Pattern, Matcher не определяет общедоступных конструкторов. Вы получаете объект Matcher, вызывая метод matcher () для объекта Pattern.

PatternSyntaxException — Объект PatternSyntaxException является непроверенным исключением, которое указывает на синтаксическую ошибку в образце регулярного выражения.

Захват групп

Захват групп — это способ рассматривать несколько символов как единое целое. Они создаются путем помещения символов, которые будут сгруппированы, в набор скобок. Например, регулярное выражение (собака) создает одну группу, содержащую буквы «d», «o» и «g».

Захватывающие группы нумеруются путем подсчета открывающих скобок слева направо. В выражении ((A) (B (C))), например, есть четыре такие группы —

  • ((А) (В (С)))
  • (А)
  • (ДО НАШЕЙ ЭРЫ))
  • (С)

Чтобы узнать, сколько групп присутствует в выражении, вызовите метод groupCount для объекта соответствия. Метод groupCount возвращает int, показывающий количество групп захвата, присутствующих в шаблоне сопоставителя.

Существует также специальная группа, группа 0, которая всегда представляет все выражение. Эта группа не включена в общее количество, сообщенное groupCount.

пример

В следующем примере показано, как найти строку цифр из заданной буквенно-цифровой строки:

Live Demo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {
      // String to be scanned to find the pattern.
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      }else {
         System.out.println("NO MATCH");
      }
   }
}

Это даст следующий результат —

Выход

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

Синтаксис регулярных выражений

Вот таблица со списком всех синтаксисов метасимволов регулярных выражений, доступных в Java:

Подвыражение Матчи
^ Соответствует началу строки.
$ Соответствует концу строки.
, Соответствует любому отдельному символу, кроме новой строки. Использование опции m позволяет ему соответствовать и новой строке.
[…] Соответствует любому отдельному символу в скобках.
[^ …] Соответствует любому отдельному символу не в скобках.
\ A Начало всей строки.
\ г Конец всей строки.
\ Z Конец всей строки, кроме допустимого конечного конца строки.
ре * Соответствует 0 или более вхождений предыдущего выражения.
ре + Соответствует 1 или более из предыдущей вещи.
повторно? Соответствует 0 или 1 вхождению предыдущего выражения.
re {n} Совпадает ровно с числом вхождений предыдущего выражения.
re {n,} Соответствует n или более вхождений предыдущего выражения.
re {n, m} Соответствует не менее n и не более m вхождений предыдущего выражения.
| б Соответствует либо a, либо b.
(Ре) Группирует регулярные выражения и запоминает сопоставленный текст.
(?: re) Группирует регулярные выражения без запоминания сопоставленного текста.
(?> re) Соответствует независимому образцу без возврата.
\ ш Соответствует слову символов.
\ W Соответствует несловесным символам.
\ s Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].
\ S Соответствует непробельному пространству.
\ d Соответствует цифрам. Эквивалентно [0-9].
\ D Совпадает с нецифрами.
\ A Соответствует началу строки.
\ Z Соответствует концу строки. Если новая строка существует, она совпадает непосредственно перед новой строкой.
\ г Соответствует концу строки.
Соответствует точке, где закончился последний матч.
\ п Обратная ссылка для захвата номера группы «n».
\ б Соответствует границам слов вне скобок. Соответствует возврату (0x08) внутри скобок.
\ B Соответствует границам без слов.
\ n, \ t и т. д. Сопоставляет переводы строк, возврат каретки, вкладки и т. Д.
\ Q Побег (цитата) всех символов до \ E.
\ E Завершает цитирование, начинающееся с \ Q.

Методы класса Matcher

Вот список полезных методов экземпляра —

Методы индекса

Методы индекса предоставляют полезные значения индекса, которые точно показывают, где совпадение было найдено во входной строке —

Sr.No. Метод и описание
1

public int start ()

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

2

public int start (группа int)

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

3

public int end ()

Возвращает смещение после совпадения последнего символа.

4

public int end (int group)

Возвращает смещение после последнего символа подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления.

public int start ()

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

public int start (группа int)

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

public int end ()

Возвращает смещение после совпадения последнего символа.

public int end (int group)

Возвращает смещение после последнего символа подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления.

Методы обучения

Методы исследования проверяют входную строку и возвращают логическое значение, указывающее, найден ли шаблон —

Sr.No. Метод и описание
1

public boolean LookingAt ()

Пытается сопоставить входную последовательность, начиная с начала региона, с шаблоном.

2

public boolean find ()

Пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

3

публичная логическая находка (int start)

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

4

публичные логические совпадения ()

Попытки сопоставить весь регион с шаблоном.

public boolean LookingAt ()

Пытается сопоставить входную последовательность, начиная с начала региона, с шаблоном.

public boolean find ()

Пытается найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

публичная логическая находка (int start)

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

публичные логические совпадения ()

Попытки сопоставить весь регион с шаблоном.

Методы замены

Методы замены являются полезными методами для замены текста во входной строке —

Sr.No. Метод и описание
1

public Matcher appendReplacement (StringBuffer sb, String replace)

Реализует нетерминальный шаг добавления и замены.

2

public StringBuffer appendTail (StringBuffer sb)

Реализует шаг добавления и замены терминала.

3

public String replaceAll (замена строки)

Заменяет каждую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

4

public String replaceFirst (замена строки)

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

5

public static String quoteReplacement (String s)

Возвращает буквенную замещающую строку для указанной строки. Этот метод создает строку, которая будет работать в качестве литеральной замены в методе appendReplacement класса Matcher.

public Matcher appendReplacement (StringBuffer sb, String replace)

Реализует нетерминальный шаг добавления и замены.

public StringBuffer appendTail (StringBuffer sb)

Реализует шаг добавления и замены терминала.

public String replaceAll (замена строки)

Заменяет каждую подпоследовательность входной последовательности, которая соответствует шаблону с данной строкой замены.

public String replaceFirst (замена строки)

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

public static String quoteReplacement (String s)

Возвращает буквенную замещающую строку для указанной строки. Этот метод создает строку, которая будет работать в качестве литеральной замены в методе appendReplacement класса Matcher.

Методы начала и конца

Ниже приведен пример, который подсчитывает, сколько раз слово «кошка» появляется во входной строке:

пример

Live Demo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = "\\bcat\\b";
   private static final String INPUT = "cat cat cat cattie cat";

   public static void main( String args[] ) {
      Pattern p = Pattern.compile(REGEX);
      Matcher m = p.matcher(INPUT);   // get a matcher object
      int count = 0;

      while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

Это даст следующий результат —

Выход

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

Вы можете видеть, что этот пример использует границы слов, чтобы гарантировать, что буквы «c» «a» «t» не являются просто подстрокой в ​​более длинном слове. Это также дает некоторую полезную информацию о том, где во входной строке произошло совпадение.

Метод start возвращает начальный индекс подпоследовательности, захваченной данной группой во время предыдущей операции сопоставления, а end возвращает индекс последнего сопоставленного символа плюс один.

Спички и методы поиска

Методы match и LookingAt пытаются сопоставить входную последовательность с шаблоном. Разница, однако, заключается в том, что для сопоставления требуется сопоставление всей входной последовательности, а для lookAt — нет.

Оба метода всегда начинаются с начала строки ввода. Вот пример, объясняющий функциональность —

пример

Live Demo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = "foo";
   private static final String INPUT = "fooooooooooooooooo";
   private static Pattern pattern;
   private static Matcher matcher;

   public static void main( String args[] ) {
      pattern = Pattern.compile(REGEX);
      matcher = pattern.matcher(INPUT);

      System.out.println("Current REGEX is: "+REGEX);
      System.out.println("Current INPUT is: "+INPUT);

      System.out.println("lookingAt(): "+matcher.lookingAt());
      System.out.println("matches(): "+matcher.matches());
   }
}

Это даст следующий результат —

Выход

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

Заменить первый и заменить все методы

Методы replaceFirst и replaceAll заменяют текст, соответствующий заданному регулярному выражению. Как указывают их имена, replaceFirst заменяет первое вхождение, а replaceAll заменяет все вхождения.

Вот пример, объясняющий функциональность —

пример

Live Demo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = "dog";
   private static String INPUT = "The dog says meow. " + "All dogs say meow.";
   private static String REPLACE = "cat";

   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT); 
      INPUT = m.replaceAll(REPLACE);
      System.out.println(INPUT);
   }
}

Это даст следующий результат —

Выход

The cat says meow. All cats say meow.

Методы appendReplace и appendTail

Класс Matcher также предоставляет методы appendReplacement и appendTail для замены текста.

Вот пример, объясняющий функциональность —

пример

Live Demo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);
      
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()) {
         m.appendReplacement(sb, REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

Это даст следующий результат —

Выход

-foo-foo-foo-

Методы класса PatternSyntaxException

PatternSyntaxException — это непроверенное исключение, которое указывает на синтаксическую ошибку в шаблоне регулярного выражения. Класс PatternSyntaxException предоставляет следующие методы, чтобы помочь вам определить, что пошло не так —

Sr.No. Метод и описание
1

public String getDescription ()

Получает описание ошибки.

2

public int getIndex ()

Получает индекс ошибки.

3

public String getPattern ()

Получает ошибочный шаблон регулярного выражения.

4

public String getMessage ()

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

public String getDescription ()

Получает описание ошибки.

public int getIndex ()

Получает индекс ошибки.

public String getPattern ()

Получает ошибочный шаблон регулярного выражения.

public String getMessage ()

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

Java — Методы

Java-метод — это набор операторов, сгруппированных для выполнения операции. Когда вы звоните System.out. Например, метод println () , система фактически выполняет несколько операторов для отображения сообщения на консоли.

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

Создание метода

Рассмотрим следующий пример для объяснения синтаксиса метода —

Синтаксис

public static int methodName(int a, int b) {
   // body
}

Вот,

  • public static — модификатор

  • int — тип возвращаемого значения

  • methodName — название метода

  • а, б — формальные параметры

  • int a, int b — список параметров

public static — модификатор

int — тип возвращаемого значения

methodName — название метода

а, б — формальные параметры

int a, int b — список параметров

Определение метода состоит из заголовка метода и тела метода. То же самое показано в следующем синтаксисе —

Синтаксис

modifier returnType nameOfMethod (Parameter List) {
   // method body
}

Синтаксис, показанный выше, включает:

  • Модификатор — определяет тип доступа к методу и является необязательным для использования.

  • returnType — Метод может вернуть значение.

  • nameOfMethod — это имя метода. Подпись метода состоит из имени метода и списка параметров.

  • Список параметров — список параметров, это тип, порядок и количество параметров метода. Это необязательно, метод может содержать ноль параметров.

  • тело методатело метода определяет, что метод делает с операторами.

Модификатор — определяет тип доступа к методу и является необязательным для использования.

returnType — Метод может вернуть значение.

nameOfMethod — это имя метода. Подпись метода состоит из имени метода и списка параметров.

Список параметров — список параметров, это тип, порядок и количество параметров метода. Это необязательно, метод может содержать ноль параметров.

тело методатело метода определяет, что метод делает с операторами.

пример

Вот исходный код определенного выше метода с именем min () . Этот метод принимает два параметра num1 и num2 и возвращает максимум между двумя —

/** the snippet returns the minimum between two numbers */

public static int minFunction(int n1, int n2) {
   int min;
   if (n1 > n2)
      min = n2;
   else
      min = n1;

   return min; 
}

Вызов метода

Для использования метода он должен быть вызван. Существует два способа вызова метода, т. Е. Метод возвращает значение или ничего не возвращает (нет возвращаемого значения).

Процесс вызова метода прост. Когда программа вызывает метод, управление программой передается вызываемому методу. Затем этот вызываемый метод возвращает управление вызывающей стороне в двух условиях, когда —

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

Методы, возвращающие void, рассматриваются как вызов оператора. Давайте рассмотрим пример —

System.out.println("This is tutorialspoint.com!");

Метод, возвращающий значение, можно понять из следующего примера:

int result = sum(6, 9);

Ниже приведен пример, демонстрирующий, как определить метод и как его вызвать.

пример

Live Demo

public class ExampleMinNumber {
   
   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      int c = minFunction(a, b);
      System.out.println("Minimum Value = " + c);
   }

   /** returns the minimum of two numbers */
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

Это даст следующий результат —

Выход

Minimum value = 6

Пустое ключевое слово

Ключевое слово void позволяет нам создавать методы, которые не возвращают значение. Здесь, в следующем примере мы рассматриваем пустой метод methodRankPoints . Этот метод является пустым методом, который не возвращает никакого значения. Вызов метода void должен быть оператором, т.е. methodRankPoints (255.7); , Это оператор Java, который заканчивается точкой с запятой, как показано в следующем примере.

пример

Live Demo

public class ExampleVoid {

   public static void main(String[] args) {
      methodRankPoints(255.7);
   }

   public static void methodRankPoints(double points) {
      if (points >= 202.5) {
         System.out.println("Rank:A1");
      }else if (points >= 122.4) {
         System.out.println("Rank:A2");
      }else {
         System.out.println("Rank:A3");
      }
   }
}

Это даст следующий результат —

Выход

Rank:A1

Передача параметров по значению

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

Передача параметров по значению означает вызов метода с параметром. Через это значение аргумента передается параметру.

пример

Следующая программа показывает пример передачи параметра по значению. Значения аргументов остаются неизменными даже после вызова метода.

Live Demo

public class swappingExample {

   public static void main(String[] args) {
      int a = 30;
      int b = 45;
      System.out.println("Before swapping, a = " + a + " and b = " + b);

      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be same here**:");
      System.out.println("After swapping, a = " + a + " and b is " + b);
   }

   public static void swapFunction(int a, int b) {
      System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
      
      // Swap n1 with n2
      int c = a;
      a = b;
      b = c;
      System.out.println("After swapping(Inside), a = " + a + " b = " + b);
   }
}

Это даст следующий результат —

Выход

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30

**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

Перегрузка метода

Когда класс имеет два или более методов с одинаковыми именами, но разными параметрами, это называется перегрузкой методов. Это отличается от переопределения. При переопределении метод имеет то же имя, тип, число параметров и т. Д.

Рассмотрим рассмотренный ранее пример для нахождения минимального числа целочисленного типа Если, скажем, мы хотим найти минимальное число типа double. Затем будет введена концепция перегрузки для создания двух или более методов с одинаковым именем, но разными параметрами.

Следующий пример объясняет то же самое —

пример

Live Demo

public class ExampleOverloading {

   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      double c = 7.3;
      double d = 9.4;
      int result1 = minFunction(a, b);
      
      // same function name with different parameters
      double result2 = minFunction(c, d);
      System.out.println("Minimum Value = " + result1);
      System.out.println("Minimum Value = " + result2);
   }

   // for integer
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
   
   // for double
   public static double minFunction(double n1, double n2) {
     double min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

Это даст следующий результат —

Выход

Minimum Value = 6
Minimum Value = 7.3

Перегрузка методов делает программу читабельной. Здесь два метода имеют одно и то же имя, но с разными параметрами. Минимальное число из целых и двойных типов является результатом.

Использование аргументов командной строки

Иногда вы захотите передать некоторую информацию в программу при запуске. Это достигается передачей аргументов командной строки в main ().

Аргумент командной строки — это информация, которая непосредственно следует за именем программы в командной строке при ее выполнении. Получить доступ к аргументам командной строки внутри Java-программы довольно просто. Они хранятся в виде строк в массиве String, передаваемом в main ().

пример

Следующая программа отображает все аргументы командной строки, с которыми она вызывается:

public class CommandLine {

   public static void main(String args[]) { 
      for(int i = 0; i<args.length; i++) {
         System.out.println("args[" + i + "]: " +  args[i]);
      }
   }
}

Попробуйте выполнить эту программу, как показано здесь —

$java CommandLine this is a command line 200 -100

Это даст следующий результат —

Выход

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

Это ключевое слово

это ключевое слово в Java, которое используется как ссылка на объект текущего класса в методе экземпляра или в конструкторе. Используя это, вы можете ссылаться на членов класса, таких как конструкторы, переменные и методы.

Примечание . Ключевое слово this используется только внутри методов или конструкторов экземпляра.

это

В общем, ключевое слово это используется для —

  • Отличайте переменные экземпляра от локальных переменных, если они имеют одинаковые имена, в конструкторе или методе.

Отличайте переменные экземпляра от локальных переменных, если они имеют одинаковые имена, в конструкторе или методе.

class Student {
   int age;   
   Student(int age) {
      this.age = age;	
   }
}
  • Вызовите один тип конструктора (Parameterized constructor или default) из другого класса. Это известно как явный вызов конструктора.

Вызовите один тип конструктора (Parameterized constructor или default) из другого класса. Это известно как явный вызов конструктора.

class Student {
   int age
   Student() {
      this(20);
   }
   
   Student(int age) {
      this.age = age;	
   }
}

пример

Вот пример, который использует это ключевое слово для доступа к членам класса. Скопируйте и вставьте следующую программу в файл с именем This_Example.java .

Live Demo

public class This_Example {
   // Instance variable num
   int num = 10;
	
   This_Example() {
      System.out.println("This is an example program on keyword this");	
   }

   This_Example(int num) {
      // Invoking the default constructor
      this();
      
      // Assigning the local variable num to the instance variable num
      this.num = num;	   
   }
   
   public void greet() {
      System.out.println("Hi Welcome to Tutorialspoint");
   }
      
   public void print() {
      // Local variable num
      int num = 20;
      
      // Printing the local variable
      System.out.println("value of local variable num is : "+num);
      
      // Printing the instance variable
      System.out.println("value of instance variable num is : "+this.num);
      
      // Invoking the greet method of a class
      this.greet();     
   }
   
   public static void main(String[] args) {
      // Instantiating the class
      This_Example obj1 = new This_Example();
      
      // Invoking the print method
      obj1.print();
	  
      // Passing a new value to the num variable through Parameterized constructor
      This_Example obj2 = new This_Example(30);
      
      // Invoking the print method again
      obj2.print(); 
   }
}

Это даст следующий результат —

Выход

This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 10
Hi Welcome to Tutorialspoint
This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 30
Hi Welcome to Tutorialspoint

Переменные Аргументы (var-args)

JDK 1.5 позволяет передавать методу переменное число аргументов одного и того же типа. Параметр в методе объявлен следующим образом:

typeName... parameterName

В объявлении метода вы указываете тип, за которым следует многоточие (…). В методе может быть указан только один параметр переменной длины, и этот параметр должен быть последним параметром. Любые обычные параметры должны предшествовать этому.

пример

Live Demo

public class VarargsDemo {

   public static void main(String args[]) {
      // Call method with variable args  
	   printMax(34, 3, 3, 2, 56.5);
      printMax(new double[]{1, 2, 3});
   }

   public static void printMax( double... numbers) {
      if (numbers.length == 0) {
         System.out.println("No argument passed");
         return;
      }

      double result = numbers[0];

      for (int i = 1; i <  numbers.length; i++)
      if (numbers[i] >  result)
      result = numbers[i];
      System.out.println("The max value is " + result);
   }
}

Это даст следующий результат —

Выход

The max value is 56.5
The max value is 3.0

Метод finalize ()

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

Например, вы можете использовать finalize (), чтобы убедиться, что открытый файл, принадлежащий этому объекту, закрыт.

Чтобы добавить финализатор в класс, вы просто определяете метод finalize (). Среда выполнения Java вызывает этот метод всякий раз, когда собирается перезапустить объект этого класса.

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

Метод finalize () имеет такую ​​общую форму —

protected void finalize( ) {
   // finalization code here
}

Здесь ключевое слово protected — это спецификатор, который запрещает доступ к finalize () по коду, определенному вне его класса.

Это означает, что вы не можете знать, когда или даже выполнится finalize (). Например, если ваша программа заканчивается до того, как происходит сборка мусора, finalize () не будет выполняться.

Java — Файлы и ввод / вывод

Пакет java.io содержит почти все классы, которые вам могут понадобиться для ввода и вывода (ввода / вывода) в Java. Все эти потоки представляют собой источник ввода и назначение вывода. Поток в пакете java.io поддерживает много данных, таких как примитивы, объекты, локализованные символы и т. Д.

Поток

Поток может быть определен как последовательность данных. Есть два вида потоков —

  • InPutStream — InputStream используется для чтения данных из источника.

  • OutPutStream — OutputStream используется для записи данных в пункт назначения.

InPutStream — InputStream используется для чтения данных из источника.

OutPutStream — OutputStream используется для записи данных в пункт назначения.

Streams

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

Байтовые потоки

Потоки байтов Java используются для ввода и вывода 8-битных байтов. Хотя существует много классов, связанных с потоками байтов, но наиболее часто используемые классы — FileInputStream и FileOutputStream . Ниже приведен пример, который использует эти два класса для копирования входного файла в выходной файл:

пример

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {  
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Теперь давайте получим файл input.txt со следующим содержимым —

This is test for copy file.

В качестве следующего шага скомпилируйте вышеуказанную программу и выполните ее, что приведет к созданию файла output.txt с тем же содержимым, что и в input.txt. Итак, давайте поместим приведенный выше код в файл CopyFile.java и сделаем следующее:

$javac CopyFile.java
$java CopyFile

Потоки персонажей

Потоки байтов Java используются для ввода и вывода 8-битных байтов, тогда как потоки символов Java используются для ввода и вывода 16-битных юникодов. Хотя есть много классов, связанных с символьными потоками, но наиболее часто используемые классы — FileReader и FileWriter . Хотя внутренне FileReader использует FileInputStream, а FileWriter использует FileOutputStream, но здесь основное отличие состоит в том, что FileReader читает два байта за раз, а FileWriter записывает два байта за раз.

Мы можем переписать приведенный выше пример, в котором эти два класса используются для копирования входного файла (содержащего символы Юникода) в выходной файл —

пример

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

Теперь давайте получим файл input.txt со следующим содержимым —

This is test for copy file.

В качестве следующего шага скомпилируйте вышеуказанную программу и выполните ее, что приведет к созданию файла output.txt с тем же содержимым, что и в input.txt. Итак, давайте поместим приведенный выше код в файл CopyFile.java и сделаем следующее:

$javac CopyFile.java
$java CopyFile

Стандартные потоки

Все языки программирования обеспечивают поддержку стандартного ввода-вывода, когда программа пользователя может принимать ввод с клавиатуры, а затем выводить ее на экран компьютера. Если вы знакомы с языками программирования C или C ++, вы должны знать о трех стандартных устройствах STDIN, STDOUT и STDERR. Точно так же Java предоставляет следующие три стандартных потока:

  • Стандартный ввод — используется для подачи данных в пользовательскую программу, и обычно клавиатура используется в качестве стандартного потока ввода и представлена ​​как System.in .

  • Стандартный вывод — используется для вывода данных, созданных программой пользователя, и обычно для стандартного потока вывода используется экран компьютера, представленный как System.out .

  • Стандартная ошибка — используется для вывода данных об ошибках, созданных программой пользователя, и обычно для стандартного потока ошибок используется экран компьютера, представленный как System.err .

Стандартный ввод — используется для подачи данных в пользовательскую программу, и обычно клавиатура используется в качестве стандартного потока ввода и представлена ​​как System.in .

Стандартный вывод — используется для вывода данных, созданных программой пользователя, и обычно для стандартного потока вывода используется экран компьютера, представленный как System.out .

Стандартная ошибка — используется для вывода данных об ошибках, созданных программой пользователя, и обычно для стандартного потока ошибок используется экран компьютера, представленный как System.err .

Ниже приведена простая программа, которая создает InputStreamReader для чтения стандартного потока ввода, пока пользователь не введет «q» —

пример

Live Demo

import java.io.*;
public class ReadConsole {

   public static void main(String args[]) throws IOException {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}

Давайте сохраним приведенный выше код в файле ReadConsole.java и попробуем скомпилировать и выполнить его, как показано в следующей программе. Эта программа продолжает читать и выводить один и тот же символ, пока мы не нажмем ‘q’ —

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

Чтение и запись файлов

Как описано ранее, поток может быть определен как последовательность данных. InputStream используется для чтения данных из источника, а OutputStream используется для записи данных в место назначения.

Вот иерархия классов для работы с потоками ввода и вывода.

Файлы IO

Двумя важными потоками являются FileInputStream и FileOutputStream , которые будут обсуждаться в этом руководстве.

FileInputStream

Этот поток используется для чтения данных из файлов. Объекты могут быть созданы с помощью ключевого слова new, и существует несколько типов конструкторов.

Следующий конструктор принимает имя файла в виде строки для создания объекта входного потока для чтения файла —

InputStream f = new FileInputStream("C:/java/hello");

Следующий конструктор принимает объект файла для создания объекта входного потока для чтения файла. Сначала мы создаем объект файла, используя метод File () следующим образом:

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

Когда у вас есть объект InputStream , появляется список вспомогательных методов, которые можно использовать для чтения в потоке или для выполнения других операций в потоке.

Sr.No. Метод и описание
1

public void close () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

2

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

3

public int read (int r) выдает IOException {}

Этот метод читает указанный байт данных из InputStream. Возвращает int. Возвращает следующий байт данных, и -1 будет возвращено, если это конец файла.

4

public int read (byte [] r) выдает IOException {}

Этот метод считывает байты r.length из входного потока в массив. Возвращает общее количество прочитанных байтов. Если это конец файла, -1 будет возвращено.

5

public int available () выдает IOException {}

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

public void close () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

public int read (int r) выдает IOException {}

Этот метод читает указанный байт данных из InputStream. Возвращает int. Возвращает следующий байт данных, и -1 будет возвращено, если это конец файла.

public int read (byte [] r) выдает IOException {}

Этот метод считывает байты r.length из входного потока в массив. Возвращает общее количество прочитанных байтов. Если это конец файла, -1 будет возвращено.

public int available () выдает IOException {}

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

Доступны и другие важные входные потоки, более подробно вы можете обратиться к следующим ссылкам —

ByteArrayInputStream

DataInputStream

FileOutputStream

FileOutputStream используется для создания файла и записи в него данных. Поток создаст файл, если он еще не существует, прежде чем открыть его для вывода.

Вот два конструктора, которые можно использовать для создания объекта FileOutputStream.

Следующий конструктор принимает имя файла в виде строки для создания объекта входного потока для записи файла —

OutputStream f = new FileOutputStream("C:/java/hello") 

Следующий конструктор принимает объект файла для создания объекта потока вывода для записи файла. Сначала мы создаем объект файла с помощью метода File () следующим образом:

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

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

Sr.No. Метод и описание
1

public void close () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

2

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

3

public void write (int w) выдает IOException {}

Этот метод записывает указанный байт в выходной поток.

4

public void write (byte [] w)

Записывает байты w.length из упомянутого байтового массива в OutputStream.

public void close () генерирует IOException {}

Этот метод закрывает поток вывода файла. Освобождает любые системные ресурсы, связанные с файлом. Выдает IOException.

Защищенный void finalize () выбрасывает IOException {}

Этот метод очищает соединение с файлом. Гарантирует, что метод close этого потока вывода файла вызывается, когда больше нет ссылок на этот поток. Выдает IOException.

public void write (int w) выдает IOException {}

Этот метод записывает указанный байт в выходной поток.

public void write (byte [] w)

Записывает байты w.length из упомянутого байтового массива в OutputStream.

Доступны и другие важные выходные потоки, более подробно вы можете обратиться к следующим ссылкам —

ByteArrayOutputStream

DataOutputStream

пример

Ниже приведен пример для демонстрации InputStream и OutputStream:

import java.io.*;
public class fileStreamTest {

   public static void main(String args[]) {
   
      try {
         byte bWrite [] = {11,21,3,40,5};
         OutputStream os = new FileOutputStream("test.txt");
         for(int x = 0; x < bWrite.length ; x++) {
            os.write( bWrite[x] );   // writes the bytes
         }
         os.close();
     
         InputStream is = new FileInputStream("test.txt");
         int size = is.available();

         for(int i = 0; i < size; i++) {
            System.out.print((char)is.read() + "  ");
         }
         is.close();
      } catch (IOException e) {
         System.out.print("Exception");
      }	
   }
}

Приведенный выше код создаст файл test.txt и запишет заданные числа в двоичном формате. То же самое будет вывод на экране стандартного вывода.

Навигация по файлам и ввод / вывод

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

Класс файла

Класс FileReader

Класс FileWriter

Каталоги на Java

Каталог — это файл, который может содержать список других файлов и каталогов. Вы используете объект File для создания каталогов, чтобы перечислить файлы, доступные в каталоге. Для получения полной информации, проверьте список всех методов, которые вы можете вызвать в объекте File, и что связано с каталогами.

Создание каталогов

Существует два полезных метода служебных файлов , которые можно использовать для создания каталогов:

  • Метод mkdir () создает каталог, возвращая true в случае успеха и false в случае ошибки. Ошибка указывает, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, поскольку еще не существует полного пути.

  • Метод mkdirs () создает каталог и всех его родителей.

Метод mkdir () создает каталог, возвращая true в случае успеха и false в случае ошибки. Ошибка указывает, что путь, указанный в объекте File, уже существует или что каталог не может быть создан, поскольку еще не существует полного пути.

Метод mkdirs () создает каталог и всех его родителей.

Следующий пример создает каталог «/ tmp / user / java / bin» —

пример

import java.io.File;
public class CreateDir {

   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);
      
      // Create directory now.
      d.mkdirs();
   }
}

Скомпилируйте и выполните приведенный выше код для создания «/ tmp / user / java / bin».

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

Каталоги листинга

Вы можете использовать метод list (), предоставленный объектом File, чтобы вывести список всех файлов и каталогов, доступных в каталоге, следующим образом:

пример

import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;
  
      try {      
         // create new file object
         file = new File("/tmp");

         // array of files and directory
         paths = file.list();

         // for each name in the path array
         for(String path:paths) {
            // prints filename and directory name
            System.out.println(path);
         }
      } catch (Exception e) {
         // if any error occurs
         e.printStackTrace();
      }
   }
}

Это даст следующий результат на основе каталогов и файлов, доступных в вашем каталоге / tmp

Выход

test1.txt
test2.txt
ReadDir.java
ReadDir.class

Java — исключения

Исключение (или исключительное событие) — это проблема, возникающая во время выполнения программы. Когда возникает исключение, нормальный поток программы прерывается, и программа / приложение прерывается ненормально, что не рекомендуется, поэтому эти исключения должны быть обработаны.

Исключение может возникнуть по многим различным причинам. Ниже приведены некоторые сценарии, где возникает исключение.

  • Пользователь ввел неверные данные.

  • Файл, который необходимо открыть, не найден.

  • Сетевое соединение было потеряно во время связи, или JVM исчерпала память.

Пользователь ввел неверные данные.

Файл, который необходимо открыть, не найден.

Сетевое соединение было потеряно во время связи, или JVM исчерпала память.

Некоторые из этих исключений вызваны ошибкой пользователя, другие — ошибкой программиста, а другие — физическими ресурсами, которые каким-то образом вышли из строя.

Исходя из этого, у нас есть три категории исключений. Вы должны понимать их, чтобы знать, как работает обработка исключений в Java.

  • Проверенные исключения — проверенное исключение — это исключение, которое проверяется (уведомляется) компилятором во время компиляции, они также называются исключениями во время компиляции. Эти исключения не могут быть просто проигнорированы, программист должен позаботиться об этих исключениях.

Проверенные исключения — проверенное исключение — это исключение, которое проверяется (уведомляется) компилятором во время компиляции, они также называются исключениями во время компиляции. Эти исключения не могут быть просто проигнорированы, программист должен позаботиться об этих исключениях.

Например, если вы используете класс FileReader в своей программе для чтения данных из файла, если файл, указанный в его конструкторе, не существует, возникает исключение FileNotFoundException , и компилятор предлагает программисту обработать исключение.

пример

Live Demo

import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {

   public static void main(String args[]) {		
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file); 
   }
}

Если вы попытаетесь скомпилировать вышеуказанную программу, вы получите следующие исключения.

Выход

C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error

Примечание. Поскольку методы read () и close () класса FileReader выдают IOException, вы можете заметить, что компилятор уведомляет об обработке IOException вместе с FileNotFoundException.

  • Непроверенные исключения — непроверенное исключение — это исключение, которое возникает во время выполнения. Они также называются исключениями времени выполнения . К ним относятся ошибки программирования, такие как логические ошибки или неправильное использование API. Исключения во время выполнения игнорируются во время компиляции.

Непроверенные исключения — непроверенное исключение — это исключение, которое возникает во время выполнения. Они также называются исключениями времени выполнения . К ним относятся ошибки программирования, такие как логические ошибки или неправильное использование API. Исключения во время выполнения игнорируются во время компиляции.

Например, если вы объявили массив размером 5 в своей программе и пытаетесь вызвать 6- й элемент массива, возникает исключение ArrayIndexOutOfBoundsExceptionexception .

пример

Live Demo

public class Unchecked_Demo {
   
   public static void main(String args[]) {
      int num[] = {1, 2, 3, 4};
      System.out.println(num[5]);
   }
}

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующее исключение.

Выход

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)
  • Ошибки — это вовсе не исключения, а проблемы, которые возникают вне контроля пользователя или программиста. Ошибки обычно игнорируются в вашем коде, потому что вы редко можете что-либо сделать с ошибкой. Например, если переполнение стека происходит, возникнет ошибка. Они также игнорируются во время компиляции.

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

Иерархия исключений

Все классы исключений являются подтипами класса java.lang.Exception. Класс исключения является подклассом класса Throwable. Помимо класса исключений, существует другой подкласс с именем Error, который является производным от класса Throwable.

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

Класс Exception имеет два основных подкласса: класс IOException и класс RuntimeException.

Exceptions1

Ниже приведен список наиболее распространенных проверенных и непроверенных встроенных исключений Java .

Методы исключений

Ниже приведен список важных методов, доступных в классе Throwable.

Sr.No. Метод и описание
1

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

2

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

3

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage ().

4

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err, поток вывода ошибок.

5

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

6

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage ().

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err, поток вывода ошибок.

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

Ловить исключения

Метод перехватывает исключение, используя комбинацию ключевых слов try и catch . Вокруг кода помещается блок try / catch, который может генерировать исключение. Код в блоке try / catch называется защищенным кодом, и синтаксис использования try / catch выглядит следующим образом:

Синтаксис

try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

Код, подверженный исключениям, помещается в блок try. Когда возникает исключение, то возникшее исключение обрабатывается блоком catch, связанным с ним. За каждым блоком try должен немедленно следовать либо блок catch, либо блок finally.

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

пример

Ниже приведен массив, объявленный с 2 ​​элементами. Затем код пытается получить доступ к третьему элементу массива, который вызывает исключение.

Live Demo

// File Name : ExcepTest.java
import java.io.*;

public class ExcepTest {

   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

Это даст следующий результат —

Выход

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

Многократные Пойманные Блоки

За блоком try могут следовать несколько блоков catch. Синтаксис для нескольких блоков catch выглядит следующим образом:

Синтаксис

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}

Предыдущие операторы демонстрируют три блока catch, но вы можете иметь любое их количество после одной попытки. Если в защищенном коде возникает исключение, оно генерируется в первом блоке перехвата в списке. Если тип данных сгенерированного исключения совпадает с ExceptionType1, он попадает туда. Если нет, то исключение передается во второй оператор catch. Это продолжается до тех пор, пока исключение не будет перехвачено или не пройдет через все перехваты, и в этом случае текущий метод останавливает выполнение, а исключение генерируется до предыдущего метода в стеке вызовов.

пример

Вот фрагмент кода, показывающий, как использовать несколько операторов try / catch.

try {
   file = new FileInputStream(fileName);
   x = (byte) file.read();
} catch (IOException i) {
   i.printStackTrace();
   return -1;
} catch (FileNotFoundException f) // Not valid! {
   f.printStackTrace();
   return -1;
}

Поймать несколько типов исключений

Начиная с Java 7, вы можете обрабатывать более одного исключения, используя один блок catch, эта функция упрощает код. Вот как бы вы это сделали —

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Ключевые слова Броски / Бросок

Если метод не обрабатывает проверенное исключение, метод должен объявить его с помощью ключевого слова throws . Ключевое слово throws появляется в конце подписи метода.

С помощью ключевого слова throw вы можете сгенерировать исключение, либо только что созданное, либо исключение, которое вы только что перехватили.

Попытайтесь понять разницу между ключевыми словами throw и throw, throw используется для того, чтобы отложить обработку проверенного исключения, а throw используется для явного вызова исключения.

Следующий метод объявляет, что он генерирует RemoteException —

пример

import java.io.*;
public class className {

   public void deposit(double amount) throws RemoteException {
      // Method implementation
      throw new RemoteException();
   }
   // Remainder of class definition
}

Метод может объявить, что он генерирует более одного исключения, и в этом случае исключения объявляются в списке, разделенном запятыми. Например, следующий метод объявляет, что он генерирует исключение RemoteException и InsufficientFundsException —

пример

import java.io.*;
public class className {

   public void withdraw(double amount) throws RemoteException, 
      InsufficientFundsException {
      // Method implementation
   }
   // Remainder of class definition
}

Последний блок

Блок finally следует за блоком try или блоком catch. Блок кода finally всегда выполняется независимо от возникновения исключения.

Использование блока finally позволяет запускать любые операторы типа очистки, которые вы хотите выполнить, независимо от того, что происходит в защищенном коде.

Блок finally появляется в конце блоков catch и имеет следующий синтаксис:

Синтаксис

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}

пример

Live Demo

public class ExcepTest {

   public static void main(String args[]) {
      int a[] = new int[2];
      try {
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown  :" + e);
      }finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

Это даст следующий результат —

Выход

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

Обратите внимание на следующее —

  • Предложение catch не может существовать без оператора try.

  • Не обязательно иметь предложения finally, когда присутствует блок try / catch.

  • Блок try не может присутствовать без предложения catch или оператора finally.

  • Никакой код не может присутствовать между блоками try, catch, finally.

Предложение catch не может существовать без оператора try.

Не обязательно иметь предложения finally, когда присутствует блок try / catch.

Блок try не может присутствовать без предложения catch или оператора finally.

Никакой код не может присутствовать между блоками try, catch, finally.

Попробуй с ресурсами

Как правило, когда мы используем какие-либо ресурсы, такие как потоки, соединения и т. Д., Мы должны явно закрывать их, используя блок finally. В следующей программе мы читаем данные из файла, используя FileReader, и закрываем его, используя блок finally.

пример

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]) {
      FileReader fr = null;		
      try {
         File file = new File("file.txt");
         fr = new FileReader(file); char [] a = new char[50];
         fr.read(a);   // reads the content to the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }finally {
         try {
            fr.close();
         } catch (IOException ex) {		
            ex.printStackTrace();
         }
      }
   }
}

try-with-resources , также называемый автоматическим управлением ресурсами , — это новый механизм обработки исключений, представленный в Java 7, который автоматически закрывает ресурсы, используемые в блоке try catch.

Чтобы использовать этот оператор, вам просто нужно объявить необходимые ресурсы в круглых скобках, и созданный ресурс будет автоматически закрыт в конце блока. Ниже приводится синтаксис оператора try-with-resources.

Синтаксис

try(FileReader fr = new FileReader("file path")) {
   // use the resource
   } catch () {
      // body of catch 
   }
}

Ниже приведена программа, которая считывает данные в файл с помощью оператора try-with-resources.

пример

import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]) {
      try(FileReader fr = new FileReader("E://file.txt")) {
         char [] a = new char[50];
         fr.read(a);   // reads the contentto the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Следующие пункты должны быть учтены при работе с оператором try-with-resources.

  • Чтобы использовать класс с оператором try-with-resources, он должен реализовывать интерфейс AutoCloseable, и метод close () этого метода вызывается автоматически во время выполнения.

  • Вы можете объявить более одного класса в инструкции try-with-resources.

  • Хотя вы объявляете несколько классов в блоке try оператора try-with-resources, эти классы закрываются в обратном порядке.

  • За исключением объявления ресурсов в скобках, все совпадает с нормальным блоком try / catch блока try.

  • Ресурс, объявленный в try, создается непосредственно перед началом блока try.

  • Ресурс, объявленный в блоке try, неявно объявляется как final.

Чтобы использовать класс с оператором try-with-resources, он должен реализовывать интерфейс AutoCloseable, и метод close () этого метода вызывается автоматически во время выполнения.

Вы можете объявить более одного класса в инструкции try-with-resources.

Хотя вы объявляете несколько классов в блоке try оператора try-with-resources, эти классы закрываются в обратном порядке.

За исключением объявления ресурсов в скобках, все совпадает с нормальным блоком try / catch блока try.

Ресурс, объявленный в try, создается непосредственно перед началом блока try.

Ресурс, объявленный в блоке try, неявно объявляется как final.

Пользовательские исключения

Вы можете создавать свои собственные исключения в Java. При написании ваших собственных классов исключений помните следующее:

  • Все исключения должны быть детьми Throwable.

  • Если вы хотите написать проверенное исключение, которое автоматически применяется правилом Handle или Declare, вам необходимо расширить класс Exception.

  • Если вы хотите написать исключение времени выполнения, вам нужно расширить класс RuntimeException.

Все исключения должны быть детьми Throwable.

Если вы хотите написать проверенное исключение, которое автоматически применяется правилом Handle или Declare, вам необходимо расширить класс Exception.

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

Мы можем определить наш собственный класс исключения, как показано ниже:

class MyException extends Exception {
}

Вам просто нужно расширить предопределенный класс Exception, чтобы создать собственное исключение. Они считаются проверенными исключениями. Следующий класс InsufficientFundsException является определяемым пользователем исключением, которое расширяет класс Exception, делая его проверенным исключением. Класс исключений, как и любой другой класс, содержит полезные поля и методы.

пример

// File Name InsufficientFundsException.java
import java.io.*;

public class InsufficientFundsException extends Exception {
   private double amount;
   
   public InsufficientFundsException(double amount) {
      this.amount = amount;
   }
   
   public double getAmount() {
      return amount;
   }
}

Чтобы продемонстрировать использование нашего пользовательского исключения, следующий класс CheckingAccount содержит методdraw (), который выдает исключение InsufficientFundsException.

// File Name CheckingAccount.java
import java.io.*;

public class CheckingAccount {
   private double balance;
   private int number;
   
   public CheckingAccount(int number) {
      this.number = number;
   }
   
   public void deposit(double amount) {
      balance += amount;
   }
   
   public void withdraw(double amount) throws InsufficientFundsException {
      if(amount <= balance) {
         balance -= amount;
      }else {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   
   public double getBalance() {
      return balance;
   }
   
   public int getNumber() {
      return number;
   }
}

Следующая программа BankDemo демонстрирует вызов методов depositing () иdraw () в CheckingAccount.

// File Name BankDemo.java
public class BankDemo {

   public static void main(String [] args) {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500...");
      c.deposit(500.00);
      
      try {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      } catch (InsufficientFundsException e) {
         System.out.println("Sorry, but you are short $" + e.getAmount());
         e.printStackTrace();
      }
   }
}

Скомпилируйте все три вышеуказанных файла и запустите BankDemo. Это даст следующий результат —

Выход

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
         at CheckingAccount.withdraw(CheckingAccount.java:25)
         at BankDemo.main(BankDemo.java:13)

Распространенные исключения

В Java можно определить две категории исключений и ошибок.

  • Исключения JVM — это исключения / ошибки, которые генерируются исключительно или логически JVM. Примеры: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.

  • Программные исключения — эти исключения явно генерируются приложением или программистами API. Примеры: IllegalArgumentException, IllegalStateException.

Исключения JVM — это исключения / ошибки, которые генерируются исключительно или логически JVM. Примеры: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.

Программные исключения — эти исключения явно генерируются приложением или программистами API. Примеры: IllegalArgumentException, IllegalStateException.

Java — Внутренние классы

В этой главе мы обсудим внутренние классы Java.

Вложенные классы

В Java, как и методы, переменные класса также могут иметь другой класс в качестве члена. Написание одного класса в другом разрешено в Java. Класс, написанный внутри, называется вложенным классом , а класс, который содержит внутренний класс, называется внешним классом .

Синтаксис

Ниже приведен синтаксис для написания вложенного класса. Здесь класс Outer_Demo является внешним классом, а класс Inner_Demo является вложенным классом.

class Outer_Demo {
   class Inner_Demo {
   }
}

Вложенные классы делятся на два типа —

  • Нестатические вложенные классы — это нестатические члены класса.

  • Статические вложенные классы — это статические члены класса.

Нестатические вложенные классы — это нестатические члены класса.

Статические вложенные классы — это статические члены класса.

Внутренние классы

Внутренние классы (нестатические вложенные классы)

Внутренние классы — это механизм безопасности в Java. Мы знаем, что класс не может быть связан с модификатором доступа private , но если у нас есть класс как член другого класса, то внутренний класс можно сделать приватным. И это также используется для доступа к закрытым членам класса.

Внутренние классы бывают трех типов в зависимости от того, как и где вы их определяете. Они —

  • Внутренний класс
  • Метод локального внутреннего класса
  • Аноним Внутренний Класс

Внутренний класс

Создать внутренний класс довольно просто. Вам просто нужно написать класс в классе. В отличие от класса, внутренний класс может быть закрытым, и как только вы объявите внутренний класс закрытым, к нему нельзя получить доступ из объекта вне класса.

Ниже приведена программа для создания внутреннего класса и доступа к нему. В данном примере мы делаем внутренний класс закрытым и обращаемся к нему через метод.

пример

Live Demo

class Outer_Demo {
   int num;
   
   // inner class
   private class Inner_Demo {
      public void print() {
         System.out.println("This is an inner class");
      }
   }
   
   // Accessing he inner class from the method within
   void display_Inner() {
      Inner_Demo inner = new Inner_Demo();
      inner.print();
   }
}
   
public class My_class {

   public static void main(String args[]) {
      // Instantiating the outer class 
      Outer_Demo outer = new Outer_Demo();
      
      // Accessing the display_Inner() method.
      outer.display_Inner();
   }
}

Здесь вы можете заметить, что Outer_Demo — это внешний класс, Inner_Demo — это внутренний класс, display_Inner () — это метод, внутри которого мы создаем экземпляр внутреннего класса, и этот метод вызывается из основного метода.

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат —

Выход

This is an inner class.

Доступ к частным пользователям

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

Для создания экземпляра внутреннего класса сначала необходимо создать экземпляр внешнего класса. После этого, используя объект внешнего класса, ниже приведен способ, которым вы можете создать экземпляр внутреннего класса.

Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();

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

пример

Live Demo

class Outer_Demo {
   // private variable of the outer class
   private int num = 175;  
   
   // inner class
   public class Inner_Demo {
      public int getNum() {
         System.out.println("This is the getnum method of the inner class");
         return num;
      }
   }
}

public class My_class2 {

   public static void main(String args[]) {
      // Instantiating the outer class
      Outer_Demo outer = new Outer_Demo();
      
      // Instantiating the inner class
      Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
      System.out.println(inner.getNum());
   }
}

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат —

Выход

This is the getnum method of the inner class: 175

Метод локального внутреннего класса

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

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

пример

Live Demo

public class Outerclass {
   // instance method of the outer class 
   void my_Method() {
      int num = 23;

      // method-local inner class
      class MethodInner_Demo {
         public void print() {
            System.out.println("This is method inner class "+num);	   
         }   
      } // end of inner class
	   
      // Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }
   
   public static void main(String args[]) {
      Outerclass outer = new Outerclass();
      outer.my_Method();	   	   
   }
}

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат —

Выход

This is method inner class 23

Аноним Внутренний Класс

Внутренний класс, объявленный без имени класса, называется анонимным внутренним классом . В случае анонимных внутренних классов, мы объявляем и создаем их экземпляры одновременно. Обычно они используются всякий раз, когда вам необходимо переопределить метод класса или интерфейса. Синтаксис анонимного внутреннего класса следующий:

Синтаксис

AnonymousInner an_inner = new AnonymousInner() {
   public void my_method() {
      ........
      ........
   }   
};

Следующая программа показывает, как переопределить метод класса, используя анонимный внутренний класс.

пример

Live Demo

abstract class AnonymousInner {
   public abstract void mymethod();
}

public class Outer_class {

   public static void main(String args[]) {
      AnonymousInner inner = new AnonymousInner() {
         public void mymethod() {
            System.out.println("This is an example of anonymous inner class");
         }
      };
      inner.mymethod();	
   }
}

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат —

Выход

This is an example of anonymous inner class

Таким же образом вы можете переопределить методы конкретного класса, а также интерфейс, используя анонимный внутренний класс.

Анонимный внутренний класс как аргумент

Как правило, если метод принимает объект интерфейса, абстрактный класс или конкретный класс, то мы можем реализовать интерфейс, расширить абстрактный класс и передать объект методу. Если это класс, то мы можем напрямую передать его в метод.

Но во всех трех случаях вы можете передать анонимный внутренний класс методу. Вот синтаксис передачи анонимного внутреннего класса в качестве аргумента метода —

obj.my_Method(new My_Class() {
   public void Do() {
      .....
      .....
   }
});

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

пример

Live Demo

// interface
interface Message {
   String greet();
}

public class My_class {
   // method which accepts the object of interface Message
   public void displayMessage(Message m) {
      System.out.println(m.greet() +
         ", This is an example of anonymous inner class as an argument");  
   }

   public static void main(String args[]) {
      // Instantiating the class
      My_class obj = new My_class();

      // Passing an anonymous inner class as an argument
      obj.displayMessage(new Message() {
         public String greet() {
            return "Hello";
         }
      });
   }
}

Если вы скомпилируете и выполните вышеуказанную программу, она даст вам следующий результат —

Выход

Hello, This is an example of anonymous inner class as an argument

Статический вложенный класс

Статический внутренний класс — это вложенный класс, который является статическим членом внешнего класса. Доступ к нему можно получить без создания экземпляра внешнего класса, используя другие статические члены. Как и статические члены, статический вложенный класс не имеет доступа к переменным экземпляра и методам внешнего класса. Синтаксис статического вложенного класса следующий:

Синтаксис

class MyOuter {
   static class Nested_Demo {
   }
}

Создание статического вложенного класса немного отличается от создания внутреннего класса. Следующая программа показывает, как использовать статический вложенный класс.

пример

Live Demo

public class Outer {
   static class Nested_Demo {
      public void my_method() {
         System.out.println("This is my nested class");
      }
   }
   
   public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();	 
      nested.my_method();
   }
}

Если вы скомпилируете и запустите вышеуказанную программу, вы получите следующий результат —

Выход

This is my nested class

Java — Наследование

Наследование может быть определено как процесс, в котором один класс приобретает свойства (методы и поля) другого. С использованием наследования информация становится управляемой в иерархическом порядке.

Класс, который наследует свойства other, известен как подкласс (производный класс, дочерний класс), а класс, свойства которого наследуются, называется суперклассом (базовый класс, родительский класс).

расширяет ключевое слово

extends — это ключевое слово, используемое для наследования свойств класса. Ниже приводится синтаксис ключевого слова extends.

Синтаксис

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

Образец кода

Ниже приведен пример, демонстрирующий наследование Java. В этом примере вы можете наблюдать два класса, а именно: Расчет и My_Calculation.

Используя ключевое слово extends, My_Calculation наследует методы добавление () и Subtraction () класса Calculation.

Скопируйте и вставьте следующую программу в файл с именем My_Calculation.java

пример

Live Demo

class Calculation {
   int z;
	
   public void addition(int x, int y) {
      z = x + y;
      System.out.println("The sum of the given numbers:"+z);
   }
	
   public void Subtraction(int x, int y) {
      z = x - y;
      System.out.println("The difference between the given numbers:"+z);
   }
}

public class My_Calculation extends Calculation {
   public void multiplication(int x, int y) {
      z = x * y;
      System.out.println("The product of the given numbers:"+z);
   }
	
   public static void main(String args[]) {
      int a = 20, b = 10;
      My_Calculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Subtraction(a, b);
      demo.multiplication(a, b);
   }
}

Скомпилируйте и выполните приведенный выше код, как показано ниже.

javac My_Calculation.java
java My_Calculation

После выполнения программы она даст следующий результат —

Выход

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

В данной программе, когда создается объект класса My_Calculation , в нем создается копия содержимого суперкласса. Вот почему, используя объект подкласса, вы можете получить доступ к членам суперкласса.

наследование

Ссылочная переменная суперкласса может содержать объект подкласса, но с помощью этой переменной вы можете получить доступ только к членам суперкласса, поэтому для доступа к членам обоих классов рекомендуется всегда создавать ссылочную переменную для подкласса.

Если вы рассматриваете вышеуказанную программу, вы можете создать экземпляр класса, как указано ниже. Но используя ссылочную переменную суперкласса (в данном случае cal ), вы не можете вызвать метод multiplication () , который принадлежит подклассу My_Calculation.

Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);

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

Супер ключевое слово

Супер ключевое слово похоже на это ключевое слово. Ниже приведены сценарии, в которых используется ключевое слово super.

  • Он используется для различения членов суперкласса от членов подкласса, если они имеют одинаковые имена.

  • Он используется для вызова конструктора суперкласса из подкласса.

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

Он используется для вызова конструктора суперкласса из подкласса.

Разграничение членов

Если класс наследует свойства другого класса. И если члены суперкласса имеют имена, совпадающие с подклассом, для дифференциации этих переменных мы используем ключевое слово super, как показано ниже.

super.variable
super.method();

Образец кода

В этом разделе представлена ​​программа, которая демонстрирует использование ключевого слова super .

В данной программе у вас есть два класса, а именно Sub_class и Super_class , оба имеют метод display () с разными реализациями и переменную с именем num с разными значениями. Мы вызываем метод display () обоих классов и печатаем значение переменной num обоих классов. Здесь вы можете заметить, что мы использовали ключевое слово super, чтобы отличать членов суперкласса от подкласса.

Скопируйте и вставьте программу в файл с именем Sub_class.java.

пример

Live Demo

class Super_class {
   int num = 20;

   // display method of superclass
   public void display() {
      System.out.println("This is the display method of superclass");
   }
}

public class Sub_class extends Super_class {
   int num = 10;

   // display method of sub class
   public void display() {
      System.out.println("This is the display method of subclass");
   }

   public void my_method() {
      // Instantiating subclass
      Sub_class sub = new Sub_class();

      // Invoking the display() method of sub class
      sub.display();

      // Invoking the display() method of superclass
      super.display();

      // printing the value of variable num of subclass
      System.out.println("value of the variable named num in sub class:"+ sub.num);

      // printing the value of variable num of superclass
      System.out.println("value of the variable named num in super class:"+ super.num);
   }

   public static void main(String args[]) {
      Sub_class obj = new Sub_class();
      obj.my_method();
   }
}

Скомпилируйте и выполните приведенный выше код, используя следующий синтаксис.

javac Super_Demo
java Super

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

Выход

This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

Вызов конструктора суперкласса

Если класс наследует свойства другого класса, подкласс автоматически получает конструктор по умолчанию суперкласса. Но если вы хотите вызвать параметризованный конструктор суперкласса, вам нужно использовать ключевое слово super, как показано ниже.

super(values);

Образец кода

Программа, приведенная в этом разделе, демонстрирует, как использовать ключевое слово super для вызова конструктора Parameterized суперкласса. Эта программа содержит суперкласс и подкласс, где суперкласс содержит параметризованный конструктор, который принимает целочисленное значение, и мы использовали ключевое слово super для вызова параметризованного конструктора суперкласса.

Скопируйте и вставьте следующую программу в файл с именем Subclass.java

пример

Live Demo

class Superclass {
   int age;

   Superclass(int age) {
      this.age = age; 		 
   }

   public void getAge() {
      System.out.println("The value of the variable named age in super class is: " +age);
   }
}

public class Subclass extends Superclass {
   Subclass(int age) {
      super(age);
   }

   public static void main(String argd[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

Скомпилируйте и выполните приведенный выше код, используя следующий синтаксис.

javac Subclass
java Subclass

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

Выход

The value of the variable named age in super class is: 24

IS-A Отношения

IS-A — это способ сказать: этот объект является типом этого объекта. Давайте посмотрим, как ключевое слово extends используется для достижения наследования.

 общественный класс Animal {
 }

 Млекопитающее публичного класса расширяет Animal {
 }

 Общественный класс Рептилия расширяет Animal {
 }

 Публичный класс Собака расширяет Млекопитающее {
 }

Теперь, на основе приведенного выше примера, в объектно-ориентированных терминах верно следующее:

  • Животное — суперкласс класса млекопитающих.
  • Животное — суперкласс рептилий.
  • Млекопитающее и Рептилия являются подклассами класса животных.
  • Собака является подклассом классов млекопитающих и животных.

Теперь, если мы рассмотрим отношения IS-A, мы можем сказать —

  • Млекопитающее IS-A Animal
  • Рептилия IS-A Animal
  • Собака IS-A Млекопитающее
  • Отсюда: собака тоже животное

С использованием ключевого слова extends подклассы смогут наследовать все свойства суперкласса, за исключением частных свойств суперкласса.

Мы можем гарантировать, что Mammal на самом деле является Animal с использованием оператора экземпляра.

пример

Live Demo

class Animal {
}

class Mammal extends Animal {
}

class Reptile extends Animal {
}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

Это даст следующий результат —

Выход

true
true
true

Поскольку мы хорошо понимаем ключевое слово extends , давайте посмотрим, как ключевое слово Implements используется для получения отношения IS-A.

Обычно ключевое слово Implements используется с классами для наследования свойств интерфейса. Интерфейсы никогда не могут быть расширены классом.

пример

public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Ключевое слово instanceof

Давайте воспользуемся оператором instanceof, чтобы проверить, действительно ли Млекопитающее является Животным, а собака на самом деле Животным.

пример

Live Demo

interface Animal{}
class Mammal implements Animal{}

public class Dog extends Mammal {

   public static void main(String args[]) {
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

Это даст следующий результат —

Выход

true
true
true

HAS-A отношения

Эти отношения в основном основаны на использовании. Это определяет, есть ли у определенного класса определенная вещь. Это соотношение помогает уменьшить дублирование кода и ошибок.

Давайте посмотрим на пример —

пример

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
} 

Это показывает, что класс Van HAS-A Speed. Имея отдельный класс для скорости, нам не нужно помещать весь код, относящийся к скорости, в класс Van, что позволяет повторно использовать класс Speed ​​в нескольких приложениях.

В объектно-ориентированной функции пользователям не нужно беспокоиться о том, какой объект выполняет реальную работу. Чтобы достичь этого, класс Van скрывает детали реализации от пользователей класса Van. Таким образом, в основном происходит то, что пользователи просят класс Van выполнить определенное действие, а класс Van либо выполнит эту работу сам, либо попросит другой класс выполнить действие.

Типы Наследования

Существуют различные типы наследования, как показано ниже.

Типы Наследования

Важно помнить, что Java не поддерживает множественное наследование. Это означает, что класс не может расширять более одного класса. Поэтому следующее незаконно —

пример

public class extends Animal, Mammal{} 

Однако класс может реализовать один или несколько интерфейсов, что помогло Java избавиться от невозможности множественного наследования.

Java — переопределение

В предыдущей главе мы говорили о суперклассах и подклассах. Если класс наследует метод от своего суперкласса, то есть шанс переопределить метод при условии, что он не помечен как финальный.

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

В объектно-ориентированных терминах переопределение означает переопределение функциональности существующего метода.

пример

Давайте посмотрим на пример.

Live Demo

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}

Это даст следующий результат —

Выход

Animals can move
Dogs can walk and run

В приведенном выше примере вы можете видеть, что, хотя b является типом Animal, он запускает метод move в классе Dog. Причина этого заключается в следующем: во время компиляции выполняется проверка ссылочного типа. Однако во время выполнения JVM определяет тип объекта и запускает метод, который принадлежит этому конкретному объекту.

Следовательно, в приведенном выше примере программа будет правильно скомпилирована, поскольку в классе Animal есть метод move. Затем во время выполнения он запускает метод, специфичный для этого объекта.

Рассмотрим следующий пример —

пример

Live Demo

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

Это даст следующий результат —

Выход

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

Эта программа выдаст ошибку времени компиляции, так как ссылочный тип b в Animal не имеет метода с именем bark.

Правила переопределения метода

  • Список аргументов должен быть точно таким же, как и у переопределенного метода.

  • Возвращаемый тип должен быть тем же или подтипом возвращаемого типа, объявленного в исходном переопределенном методе в суперклассе.

  • Уровень доступа не может быть более ограничительным, чем уровень доступа переопределенного метода. Например: если метод суперкласса объявлен как открытый, то метод переопределения в подклассе не может быть ни частным, ни защищенным.

  • Методы экземпляра могут быть переопределены, только если они наследуются подклассом.

  • Метод, объявленный как final, не может быть переопределен.

  • Метод, объявленный как static, не может быть переопределен, но может быть повторно объявлен.

  • Если метод не может быть унаследован, он не может быть переопределен.

  • Подкласс в том же пакете, что и суперкласс экземпляра, может переопределить любой метод суперкласса, который не объявлен как private или final.

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

  • Переопределяющий метод может выдавать любые непроверенные исключения независимо от того, переопределяет ли метод исключительные ситуации или нет. Однако переопределяющий метод не должен генерировать проверенные исключения, которые являются новыми или более широкими, чем те, которые объявлены переопределенным методом. Переопределенный метод может генерировать более узкие или меньшие исключения, чем переопределенный метод.

  • Конструкторы не могут быть переопределены.

Список аргументов должен быть точно таким же, как и у переопределенного метода.

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

Уровень доступа не может быть более ограничительным, чем уровень доступа переопределенного метода. Например: если метод суперкласса объявлен как открытый, то метод переопределения в подклассе не может быть ни частным, ни защищенным.

Методы экземпляра могут быть переопределены, только если они наследуются подклассом.

Метод, объявленный как final, не может быть переопределен.

Метод, объявленный как static, не может быть переопределен, но может быть повторно объявлен.

Если метод не может быть унаследован, он не может быть переопределен.

Подкласс в том же пакете, что и суперкласс экземпляра, может переопределить любой метод суперкласса, который не объявлен как private или final.

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

Переопределяющий метод может выдавать любые непроверенные исключения независимо от того, переопределяет ли метод исключительные ситуации или нет. Однако переопределяющий метод не должен генерировать проверенные исключения, которые являются новыми или более широкими, чем те, которые объявлены переопределенным методом. Переопределенный метод может генерировать более узкие или меньшие исключения, чем переопределенный метод.

Конструкторы не могут быть переопределены.

Используя супер ключевое слово

При вызове версии переопределенного метода суперкласса используется ключевое слово super .

пример

Live Demo

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

Это даст следующий результат —

Выход

Animals can move
Dogs can walk and run

Ява — полиморфизм

Полиморфизм — это способность объекта принимать различные формы. Наиболее распространенное использование полиморфизма в ООП происходит, когда ссылка на родительский класс используется для ссылки на объект дочернего класса.

Любой объект Java, который может пройти более одного теста IS-A, считается полиморфным. В Java все объекты Java являются полиморфными, поскольку любой объект будет проходить тест IS-A для своего собственного типа и для класса Object.

Важно знать, что единственный возможный способ получить доступ к объекту — через ссылочную переменную. Ссылочная переменная может быть только одного типа. После объявления тип ссылочной переменной не может быть изменен.

Ссылочная переменная может быть переназначена другим объектам при условии, что она не объявлена ​​как финальная. Тип ссылочной переменной будет определять методы, которые она может вызывать для объекта.

Ссылочная переменная может ссылаться на любой объект своего объявленного типа или любой подтип своего объявленного типа. Ссылочная переменная может быть объявлена ​​как класс или тип интерфейса.

пример

Давайте посмотрим на пример.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

Теперь класс Deer считается полиморфным, поскольку он имеет множественное наследование. Следующее верно для приведенных выше примеров —

  • Олень — это животное
  • Олень-вегетарианец
  • Олень есть олень
  • Олень-это объект

Когда мы применяем факты ссылочной переменной к ссылке на объект Deer, следующие объявления являются допустимыми:

пример

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

Все ссылочные переменные d, a, v, o ссылаются на один и тот же объект Deer в куче.

Виртуальные методы

В этом разделе я покажу вам, как поведение переопределенных методов в Java позволяет вам использовать преимущества полиморфизма при разработке ваших классов.

Мы уже обсуждали переопределение метода, где дочерний класс может переопределять метод в своем родителе. Переопределенный метод по существу скрыт в родительском классе и не вызывается, если дочерний класс не использует ключевое слово super в переопределяющем методе.

пример

/* File name : Employee.java */
public class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }

   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String newAddress) {
      address = newAddress;
   }

   public int getNumber() {
      return number;
   }
}

Теперь предположим, что мы расширяем класс Employee следующим образом:

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary; // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName()
      + " with salary " + salary);
   }
   
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

Теперь вы внимательно изучаете следующую программу и пытаетесь определить ее результат:

/* File name : VirtualDemo.java */
public class VirtualDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");   
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Это даст следующий результат —

Выход

Constructing an Employee
Constructing an Employee

Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

Здесь мы создаем два объекта Salary. Один использует ссылку на зарплату s , а другой использует ссылку сотрудника e .

При вызове s.mailCheck () компилятор видит mailCheck () в классе Salary во время компиляции, а JVM вызывает mailCheck () в классе Salary во время выполнения.

mailCheck () для e совершенно другой, потому что e является ссылкой Employee. Когда компилятор видит e.mailCheck () , компилятор видит метод mailCheck () в классе Employee.

Здесь, во время компиляции, компилятор использовал mailCheck () в Employee для проверки этого оператора. Однако во время выполнения JVM вызывает mailCheck () в классе Salary.

Это поведение называется виртуальным вызовом метода, а эти методы называются виртуальными методами. Переопределенный метод вызывается во время выполнения, независимо от типа ссылки, которая использовалась в исходном коде во время компиляции.

Java — абстракция

Согласно словарю, абстракция — это качество общения с идеями, а не событиями. Например, когда вы рассматриваете случай электронной почты, сложные детали, такие как то, что происходит, как только вы отправляете электронную почту, протокол, используемый вашим почтовым сервером, скрыты от пользователя. Поэтому, чтобы отправить электронное письмо, вам просто нужно набрать контент, указать адрес получателя и нажать «Отправить».

Аналогично в объектно-ориентированном программировании абстракция — это процесс сокрытия деталей реализации от пользователя, только пользователю будут предоставлены только функциональные возможности. Другими словами, у пользователя будет информация о том, что делает объект, а не о том, как он это делает.

В Java абстракция достигается с помощью абстрактных классов и интерфейсов.

Абстрактный класс

Класс, который содержит абстрактное ключевое слово в своем объявлении, называется абстрактным классом.

  • Абстрактные классы могут содержать или не содержать абстрактные методы , т. Е. Методы без тела (public void get ();)

  • Но если у класса есть хотя бы один абстрактный метод, тогда класс должен быть объявлен как абстрактный.

  • Если класс объявлен как абстрактный, он не может быть создан.

  • Чтобы использовать абстрактный класс, вы должны унаследовать его от другого класса, предоставить реализации для абстрактных методов в нем.

  • Если вы наследуете абстрактный класс, вы должны предоставить реализации для всех абстрактных методов в нем.

Абстрактные классы могут содержать или не содержать абстрактные методы , т. Е. Методы без тела (public void get ();)

Но если у класса есть хотя бы один абстрактный метод, тогда класс должен быть объявлен как абстрактный.

Если класс объявлен как абстрактный, он не может быть создан.

Чтобы использовать абстрактный класс, вы должны унаследовать его от другого класса, предоставить реализации для абстрактных методов в нем.

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

пример

В этом разделе представлен пример абстрактного класса. Чтобы создать абстрактный класс, просто используйте ключевое слово abstract перед ключевым словом class в объявлении класса.

/* File name : Employee.java */
public abstract class Employee {
   private String name;
   private String address;
   private int number;

   public Employee(String name, String address, int number) {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   
   public double computePay() {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + this.name + " " + this.address);
   }

   public String toString() {
      return name + " " + address + " " + number;
   }

   public String getName() {
      return name;
   }
 
   public String getAddress() {
      return address;
   }
   
   public void setAddress(String newAddress) {
      address = newAddress;
   }
 
   public int getNumber() {
      return number;
   }
}

Вы можете заметить, что кроме абстрактных методов класс Employee такой же, как и обычный класс в Java. Класс теперь абстрактный, но он все еще имеет три поля, семь методов и один конструктор.

Теперь вы можете попробовать создать экземпляр класса Employee следующим образом:

/* File name : AbstractDemo.java */
public class AbstractDemo {

   public static void main(String [] args) {
      /* Following is not allowed and would raise error */
      Employee e = new Employee("George W.", "Houston, TX", 43);
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Когда вы компилируете вышеприведенный класс, он выдает следующую ошибку:

Employee.java:46: Employee is abstract; cannot be instantiated
      Employee e = new Employee("George W.", "Houston, TX", 43);
                   ^
1 error

Наследование абстрактного класса

Мы можем наследовать свойства класса Employee, как и конкретного класса, следующим образом:

пример

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary;   // Annual salary
   
   public Salary(String name, String address, int number, double salary) {
      super(name, address, number);
      setSalary(salary);
   }
   
   public void mailCheck() {
      System.out.println("Within mailCheck of Salary class ");
      System.out.println("Mailing check to " + getName() + " with salary " + salary);
   }
 
   public double getSalary() {
      return salary;
   }
   
   public void setSalary(double newSalary) {
      if(newSalary >= 0.0) {
         salary = newSalary;
      }
   }
   
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

Здесь вы не можете создать экземпляр класса Employee, но можете создать экземпляр класса Salary, и с помощью этого экземпляра вы можете получить доступ ко всем трем полям и семи методам класса Employee, как показано ниже.

/* File name : AbstractDemo.java */
public class AbstractDemo {

   public static void main(String [] args) {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
   }
}

Это дает следующий результат —

Выход

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class 
Mailing check to Mohd Mohtashim with salary 3600.0

 Call mailCheck using Employee reference--
Within mailCheck of Salary class 
Mailing check to John Adams with salary 2400.0

Абстрактные методы

Если вы хотите, чтобы класс содержал определенный метод, но вы хотите, чтобы фактическая реализация этого метода определялась дочерними классами, вы можете объявить метод в родительском классе как абстрактный.

  • Ключевое слово abstract используется для объявления метода как абстрактного.

  • Вы должны поместить абстрактное ключевое слово перед именем метода в объявлении метода.

  • Абстрактный метод содержит сигнатуру метода, но не содержит тела метода.

  • Вместо фигурных скобок у абстрактного метода в конце будет двоеточие semoi (;).

Ключевое слово abstract используется для объявления метода как абстрактного.

Вы должны поместить абстрактное ключевое слово перед именем метода в объявлении метода.

Абстрактный метод содержит сигнатуру метода, но не содержит тела метода.

Вместо фигурных скобок у абстрактного метода в конце будет двоеточие semoi (;).

Ниже приведен пример абстрактного метода.

пример

public abstract class Employee {
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   // Remainder of class definition
}

Объявление метода как абстрактного имеет два последствия:

  • Класс, содержащий его, должен быть объявлен как абстрактный.

  • Любой класс, наследующий текущий класс, должен либо переопределить абстрактный метод, либо объявить себя абстрактным.

Класс, содержащий его, должен быть объявлен как абстрактный.

Любой класс, наследующий текущий класс, должен либо переопределить абстрактный метод, либо объявить себя абстрактным.

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

Предположим, что класс Salary наследует класс Employee, тогда он должен реализовать метод computePay (), как показано ниже:

/* File name : Salary.java */
public class Salary extends Employee {
   private double salary;   // Annual salary
  
   public double computePay() {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
   // Remainder of class definition
}

Java — Инкапсуляция

Инкапсуляция является одной из четырех основных концепций ООП. Другие три — это наследование, полиморфизм и абстракция.

Инкапсуляция в Java — это механизм объединения данных (переменных) и кода, действующих на данные (методы), в одно целое. В инкапсуляции переменные класса будут скрыты от других классов и доступны только через методы их текущего класса. Поэтому он также известен как скрытие данных .

Для достижения инкапсуляции в Java —

  • Объявите переменные класса как частные.

  • Предоставить общедоступные методы установки и получения для изменения и просмотра значений переменных.

Объявите переменные класса как частные.

Предоставить общедоступные методы установки и получения для изменения и просмотра значений переменных.

пример

Ниже приведен пример, демонстрирующий, как добиться инкапсуляции в Java.

/* File name : EncapTest.java */
public class EncapTest {
   private String name;
   private String idNum;
   private int age;

   public int getAge() {
      return age;
   }

   public String getName() {
      return name;
   }

   public String getIdNum() {
      return idNum;
   }

   public void setAge( int newAge) {
      age = newAge;
   }

   public void setName(String newName) {
      name = newName;
   }

   public void setIdNum( String newId) {
      idNum = newId;
   }
}

Публичные методы setXXX () и getXXX () являются точками доступа переменных экземпляра класса EncapTest. Обычно эти методы называются геттерами и сеттерами. Поэтому любой класс, который хочет получить доступ к переменным, должен обращаться к ним через эти методы получения и установки.

Доступ к переменным класса EncapTest можно получить с помощью следующей программы:

/* File name : RunEncap.java */
public class RunEncap {

   public static void main(String args[]) {
      EncapTest encap = new EncapTest();
      encap.setName("James");
      encap.setAge(20);
      encap.setIdNum("12343ms");

      System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge());
   }
}

Это даст следующий результат —

Выход

Name : James Age : 20

Преимущества инкапсуляции

  • Поля класса могут быть сделаны только для чтения или только для записи.

  • Класс может иметь полный контроль над тем, что хранится в его полях.

Поля класса могут быть сделаны только для чтения или только для записи.

Класс может иметь полный контроль над тем, что хранится в его полях.

Java — Интерфейсы

Интерфейс является ссылочным типом в Java. Это похоже на класс. Это коллекция абстрактных методов. Класс реализует интерфейс, таким образом наследуя абстрактные методы интерфейса.

Наряду с абстрактными методами интерфейс может также содержать константы, методы по умолчанию, статические методы и вложенные типы. Тела методов существуют только для стандартных методов и статических методов.

Написание интерфейса похоже на написание класса. Но класс описывает атрибуты и поведение объекта. И интерфейс содержит поведения, которые реализует класс.

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

Интерфейс похож на класс в следующих отношениях —

  • Интерфейс может содержать любое количество методов.

  • Интерфейс записывается в файл с расширением .java , имя интерфейса которого совпадает с именем файла.

  • Байт-код интерфейса появляется в файле .class .

  • Интерфейсы появляются в пакетах, и соответствующий им файл байт-кода должен находиться в структуре каталогов, соответствующей имени пакета.

Интерфейс может содержать любое количество методов.

Интерфейс записывается в файл с расширением .java , имя интерфейса которого совпадает с именем файла.

Байт-код интерфейса появляется в файле .class .

Интерфейсы появляются в пакетах, и соответствующий им файл байт-кода должен находиться в структуре каталогов, соответствующей имени пакета.

Тем не менее, интерфейс отличается от класса в нескольких отношениях, в том числе —

  • Вы не можете создать экземпляр интерфейса.

  • Интерфейс не содержит конструкторов.

  • Все методы в интерфейсе являются абстрактными.

  • Интерфейс не может содержать поля экземпляра. Единственные поля, которые могут появиться в интерфейсе, должны быть объявлены как static, так и final.

  • Интерфейс не расширен классом; это реализуется классом.

  • Интерфейс может расширять несколько интерфейсов.

Вы не можете создать экземпляр интерфейса.

Интерфейс не содержит конструкторов.

Все методы в интерфейсе являются абстрактными.

Интерфейс не может содержать поля экземпляра. Единственные поля, которые могут появиться в интерфейсе, должны быть объявлены как static, так и final.

Интерфейс не расширен классом; это реализуется классом.

Интерфейс может расширять несколько интерфейсов.

Объявление интерфейсов

Ключевое слово interface используется для объявления интерфейса. Вот простой пример объявления интерфейса:

пример

Ниже приведен пример интерфейса —

/* File name : NameOfInterface.java */
import java.lang.*;
// Any number of import statements

public interface NameOfInterface {
   // Any number of final, static fields
   // Any number of abstract method declarations\
}

Интерфейсы имеют следующие свойства —

  • Интерфейс неявно абстрактный. Вам не нужно использовать ключевое слово abstract при объявлении интерфейса.

  • Каждый метод в интерфейсе также неявно абстрактный, поэтому ключевое слово abstract не требуется.

  • Методы в интерфейсе неявно общедоступны.

Интерфейс неявно абстрактный. Вам не нужно использовать ключевое слово abstract при объявлении интерфейса.

Каждый метод в интерфейсе также неявно абстрактный, поэтому ключевое слово abstract не требуется.

Методы в интерфейсе неявно общедоступны.

пример

/* File name : Animal.java */
interface Animal {
   public void eat();
   public void travel();
}

Реализация интерфейсов

Когда класс реализует интерфейс, вы можете думать о классе как о подписании контракта, соглашающегося выполнять определенное поведение интерфейса. Если класс не выполняет все поведения интерфейса, класс должен объявить себя абстрактным.

Класс использует ключевое слово Implements для реализации интерфейса. Ключевое слово Implements появляется в объявлении класса после расширенной части объявления.

пример

/* File name : MammalInt.java */
public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 

Это даст следующий результат —

Выход

Mammal eats
Mammal travels

При переопределении методов, определенных в интерфейсах, необходимо соблюдать несколько правил:

  • Проверенные исключения не должны объявляться в методах реализации, отличных от тех, которые объявлены методом интерфейса, или подклассов тех, которые объявлены методом интерфейса.

  • Сигнатура метода интерфейса и того же возвращаемого типа или подтипа должна сохраняться при переопределении методов.

  • Сам класс реализации может быть абстрактным, и если это так, методы интерфейса не должны быть реализованы.

Проверенные исключения не должны объявляться в методах реализации, отличных от тех, которые объявлены методом интерфейса, или подклассов тех, которые объявлены методом интерфейса.

Сигнатура метода интерфейса и того же возвращаемого типа или подтипа должна сохраняться при переопределении методов.

Сам класс реализации может быть абстрактным, и если это так, методы интерфейса не должны быть реализованы.

При реализации интерфейсов существует несколько правил —

  • Класс может реализовывать более одного интерфейса одновременно.

  • Класс может расширять только один класс, но реализовывать множество интерфейсов.

  • Интерфейс может расширять другой интерфейс, аналогично тому, как класс может расширять другой класс.

Класс может реализовывать более одного интерфейса одновременно.

Класс может расширять только один класс, но реализовывать множество интерфейсов.

Интерфейс может расширять другой интерфейс, аналогично тому, как класс может расширять другой класс.

Расширение интерфейсов

Интерфейс может расширять другой интерфейс так же, как класс может расширять другой класс. Ключевое слово extends используется для расширения интерфейса, а дочерний интерфейс наследует методы родительского интерфейса.

Следующий интерфейс Sports расширен интерфейсами Hockey и Football.

пример

// Filename: Sports.java
public interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// Filename: Football.java
public interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// Filename: Hockey.java
public interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

Интерфейс Hockey имеет четыре метода, но он наследует два от Sports; таким образом, класс, который реализует Хоккей, должен реализовать все шесть методов. Точно так же класс, который реализует Football, должен определить три метода из Football и два метода из Sports.

Расширение нескольких интерфейсов

Класс Java может расширять только один родительский класс. Многократное наследование не допускается. Однако интерфейсы не являются классами, и интерфейс может расширять несколько родительских интерфейсов.

Ключевое слово extends используется один раз, а родительские интерфейсы объявляются в списке через запятую.

Например, если интерфейс Hockey расширяет как Sports, так и Event, он будет объявлен как —

пример

public interface Hockey extends Sports, Event

Интерфейсы тегов

Наиболее распространенное использование расширяемых интерфейсов происходит, когда родительский интерфейс не содержит никаких методов. Например, интерфейс MouseListener в пакете java.awt.event расширяет java.util.EventListener, который определяется как —

пример

package java.util;
public interface EventListener
{}

Интерфейс без методов называется интерфейсом тегирования . Существует две основные цели разработки интерфейсов тегирования —

Создает общего родителя. Как и в случае интерфейса EventListener, который расширяется десятками других интерфейсов в Java API, вы можете использовать интерфейс тегов для создания общего родителя среди группы интерфейсов. Например, когда интерфейс расширяет EventListener, JVM знает, что этот конкретный интерфейс будет использоваться в сценарии делегирования события.

Добавляет тип данных в класс. В этой ситуации используется термин тегирование. Класс, который реализует интерфейс тегирования, не должен определять какие-либо методы (поскольку у интерфейса их нет), но класс становится типом интерфейса посредством полиморфизма.

Java — Пакеты

Пакеты используются в Java для предотвращения конфликтов имен, для контроля доступа, для упрощения поиска / размещения и использования классов, интерфейсов, перечислений и аннотаций и т. Д.

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

Некоторые из существующих пакетов в Java:

  • java.lang — связывает фундаментальные классы

  • java.io — классы для ввода, функции вывода включены в этот пакет

java.lang — связывает фундаментальные классы

java.io — классы для ввода, функции вывода включены в этот пакет

Программисты могут определять свои собственные пакеты для объединения групп классов / интерфейсов и т. Д. Рекомендуется группировать связанные классы, реализованные вами, чтобы программист мог легко определить, что классы, интерфейсы, перечисления и аннотации связаны между собой.

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

Создание пакета

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

Инструкция пакета должна быть первой строкой в ​​исходном файле. В каждом исходном файле может быть только один оператор пакета, и он применяется ко всем типам в файле.

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

Для компиляции программ Java с помощью операторов пакета вы должны использовать опцию -d, как показано ниже.

javac -d Destination_folder file_name.java

Затем в указанном месте назначения создается папка с заданным именем пакета, и скомпилированные файлы классов будут помещены в эту папку.

пример

Давайте посмотрим на пример, который создает пакет под названием животных . Рекомендуется использовать имена пакетов с строчными буквами, чтобы избежать конфликтов с именами классов и интерфейсов.

Следующий пример пакета содержит интерфейс с именем animals

/* File name : Animal.java */
package animals;

interface Animal {
   public void eat();
   public void travel();
}

Теперь давайте реализуем вышеуказанный интерфейс в том же пакете животных

package animals;
/* File name : MammalInt.java */

public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 

Теперь скомпилируйте Java-файлы, как показано ниже —

$ javac -d . Animal.java 
$ javac -d . MammalInt.java

Теперь пакет / папка с именем животных будет создан в текущем каталоге, и эти файлы классов будут размещены в нем, как показано ниже.

пакеты

Вы можете выполнить файл класса в пакете и получить результат, как показано ниже.

Mammal eats
Mammal travels

Ключевое слово импорта

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

пример

Здесь класс с именем Boss добавляется к пакету заработной платы, который уже содержит Employee. Затем босс может ссылаться на класс Employee без использования префикса начисления заработной платы, как демонстрирует следующий класс Boss.

package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}

Что произойдет, если класс Employee отсутствует в пакете заработной платы? Класс Boss должен затем использовать один из следующих методов для ссылки на класс в другом пакете.

  • Полное имя класса может быть использовано. Например —
payroll.Employee
  • Пакет можно импортировать с помощью ключевого слова import и подстановочного знака (*). Например —

Пакет можно импортировать с помощью ключевого слова import и подстановочного знака (*). Например —

import payroll.*;
  • Сам класс может быть импортирован с помощью ключевого слова import. Например —
import payroll.Employee;

Примечание . Файл класса может содержать любое количество операторов импорта. Операторы импорта должны появляться после оператора пакета и перед объявлением класса.

Структура каталогов пакетов

Два основных результата возникают, когда класс помещается в пакет.

  • Имя пакета становится частью имени класса, как мы только что обсуждали в предыдущем разделе.

  • Имя пакета должно соответствовать структуре каталогов, в которой находится соответствующий байт-код.

Имя пакета становится частью имени класса, как мы только что обсуждали в предыдущем разделе.

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

Вот простой способ управления вашими файлами в Java —

Поместите исходный код для класса, интерфейса, перечисления или типа аннотации в текстовый файл, имя которого является простым именем типа, а расширение — .java .

Например —

// File Name :  Car.java
package vehicle;

public class Car {
   // Class implementation.   
}

Теперь поместите исходный файл в каталог, имя которого отражает имя пакета, к которому принадлежит класс.

....\vehicle\Car.java

Теперь квалифицированное имя класса и путь будут выглядеть следующим образом:

  • Название класса → vehicle.Car
  • Имя пути → транспортное средство \ Car.java (в окнах)

Как правило, компания использует свое обратное доменное имя в Интернете для своих имен пакетов.

Пример . Интернет-домен компании называется apple.com, тогда все имена его пакетов начинаются с com.apple. Каждый компонент имени пакета соответствует подкаталогу.

Пример — у компании был пакет com.apple.computers, который содержал исходный файл Dell.java, он будет содержаться в ряде таких подкаталогов, как этот —

....\com\apple\computers\Dell.java

Во время компиляции компилятор создает разные выходные файлы для каждого класса, интерфейса и перечисления, определенных в нем. Базовое имя выходного файла — это имя типа, а его расширение — .class .

Например —

// File Name: Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}

Теперь скомпилируйте этот файл следующим образом, используя опцию -d —

$javac -d . Dell.java

Файлы будут скомпилированы следующим образом —

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

Вы можете импортировать все классы или интерфейсы, определенные в \ com \ apple \ computers \, следующим образом:

import com.apple.computers.*;

Как и исходные файлы .java, скомпилированные файлы .class должны находиться в серии каталогов, отражающих имя пакета. Однако путь к файлам .class не обязательно должен совпадать с путем к исходным файлам .java. Вы можете расположить свои исходные и классные каталоги отдельно, так как —

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

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

Полный путь к каталогу классов, <путь-два> \ classes, называется путем к классу и задается системной переменной CLASSPATH. И компилятор, и JVM создают путь к вашим файлам .class, добавляя имя пакета в путь к классу.

Скажите, что <путь-два> \ classes — это путь к классу, а имя пакета — com.apple.computers, тогда компилятор и JVM будут искать файлы .class в <path-two> \ classes \ com \ apple \ computers.

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

Задать системную переменную CLASSPATH

Чтобы отобразить текущую переменную CLASSPATH, используйте следующие команды в Windows и UNIX (оболочка Bourne) —

  • В Windows → C: \> установить CLASSPATH
  • В UNIX →% echo $ CLASSPATH

Чтобы удалить текущее содержимое переменной CLASSPATH, используйте —

  • В Windows → C: \> установить CLASSPATH =
  • В UNIX →% не установлено CLASSPATH; экспорт CLASSPATH

Чтобы установить переменную CLASSPATH —

  • В Windows → установите CLASSPATH = C: \ users \ jack \ java \ classes
  • В UNIX →% CLASSPATH = / home / jack / java / классы; экспорт CLASSPATH

Java — структуры данных

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

  • перечисление
  • BitSet
  • Вектор
  • стек
  • толковый словарь
  • Хеш-таблица
  • свойства

Все эти классы теперь унаследованы, и Java-2 представила новую платформу под названием Collections Framework, которая обсуждается в следующей главе.

Перечисление

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

Например, Enumeration определяет метод с именем nextElement, который используется для получения следующего элемента в структуре данных, которая содержит несколько элементов.

Чтобы получить более подробную информацию об этом интерфейсе, проверьте перечисление .

Битсет

Класс BitSet реализует группу битов или флагов, которые могут быть установлены и очищены индивидуально.

Этот класс очень полезен в тех случаях, когда вам нужно идти в ногу с набором логических значений; Вы просто назначаете бит каждому значению и устанавливаете или очищаете его соответствующим образом.

Для более подробной информации об этом классе, проверьте The BitSet .

Вектор

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

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

Хорошая вещь об использовании класса Vector заключается в том, что вам не нужно беспокоиться о том, чтобы установить его в определенный размер при создании; он сжимается и растет автоматически при необходимости.

Для получения более подробной информации об этом классе, проверьте Вектор .

Стек

Класс Stack реализует стек элементов «последний пришел первым — вышел» (LIFO).

Вы можете думать о стеке буквально как о вертикальной стопке объектов; когда вы добавляете новый элемент, он накладывается поверх остальных.

Когда вы вытаскиваете элемент из стека, он выходит сверху. Другими словами, последний элемент, который вы добавили в стек, является первым, который возвращается.

Для более подробной информации об этом классе, проверьте The Stack .

Словарь

Класс Dictionary — это абстрактный класс, который определяет структуру данных для сопоставления ключей со значениями.

Это полезно в тех случаях, когда вы хотите иметь доступ к данным через определенный ключ, а не целочисленный индекс.

Поскольку класс Dictionary является абстрактным, он обеспечивает только структуру для структуры данных с ключами, а не конкретную реализацию.

Для получения более подробной информации об этом классе, проверьте словарь .

Hashtable

Класс Hashtable предоставляет средства организации данных на основе некоторой определенной пользователем структуры ключей.

Например, в хэш-таблице списка адресов вы можете хранить и сортировать данные по ключу, такому как почтовый индекс, а не по имени человека.

Конкретное значение ключей в отношении хеш-таблиц полностью зависит от использования хеш-таблицы и содержащихся в ней данных.

Для более подробной информации об этом классе, проверьте Hashtable .

Свойства

Свойства является подклассом Hashtable. Он используется для ведения списков значений, в которых ключ является строкой, а значение также является строкой.

Класс Properties используется многими другими классами Java. Например, это тип объекта, возвращаемый System.getProperties () при получении значений среды.

Для более подробной информации об этом классе, проверьте Свойства .

Java — платформа коллекций

До Java 2 Java предоставляла специальные классы, такие как Dictionary, Vector, Stack и Properties, для хранения и управления группами объектов. Хотя эти занятия были весьма полезны, им не хватало центральной объединяющей темы. Таким образом, способ, которым вы использовали Vector, отличался от того, как вы использовали Properties.

Структура коллекций была разработана для достижения нескольких целей, таких как —

  • Фреймворк должен был быть высокопроизводительным. Реализации для базовых коллекций (динамические массивы, связанные списки, деревья и хеш-таблицы) должны были быть очень эффективными.

  • Структура должна была позволять различным типам коллекций работать одинаково и с высокой степенью взаимодействия.

  • Каркас должен был легко расширять и / или адаптировать коллекцию.

Фреймворк должен был быть высокопроизводительным. Реализации для базовых коллекций (динамические массивы, связанные списки, деревья и хеш-таблицы) должны были быть очень эффективными.

Структура должна была позволять различным типам коллекций работать одинаково и с высокой степенью взаимодействия.

Каркас должен был легко расширять и / или адаптировать коллекцию.

С этой целью вся структура коллекций разработана на основе набора стандартных интерфейсов. Предусмотрено несколько стандартных реализаций этих интерфейсов, таких как LinkedList, HashSet и TreeSet , которые вы можете использовать как есть, и вы также можете реализовать свою собственную коллекцию, если захотите.

Каркас коллекций — это унифицированная архитектура для представления коллекций и управления ими. Все рамки коллекций содержат следующее —

  • Интерфейсы — это абстрактные типы данных, которые представляют коллекции. Интерфейсы позволяют манипулировать коллекциями независимо от деталей их представления. В объектно-ориентированных языках интерфейсы обычно образуют иерархию.

  • Реализации, т. Е. Классы — это конкретные реализации интерфейсов коллекции. По сути, они являются структурами данных многократного использования.

  • Алгоритмы — это методы, которые выполняют полезные вычисления, такие как поиск и сортировка, для объектов, которые реализуют интерфейсы коллекции. Говорят, что алгоритмы полиморфны: один и тот же метод может использоваться во многих различных реализациях соответствующего интерфейса коллекции.

Интерфейсы — это абстрактные типы данных, которые представляют коллекции. Интерфейсы позволяют манипулировать коллекциями независимо от деталей их представления. В объектно-ориентированных языках интерфейсы обычно образуют иерархию.

Реализации, т. Е. Классы — это конкретные реализации интерфейсов коллекции. По сути, они являются структурами данных многократного использования.

Алгоритмы — это методы, которые выполняют полезные вычисления, такие как поиск и сортировка, для объектов, которые реализуют интерфейсы коллекции. Говорят, что алгоритмы полиморфны: один и тот же метод может использоваться во многих различных реализациях соответствующего интерфейса коллекции.

В дополнение к коллекциям платформа определяет несколько интерфейсов и классов карты. Карты хранят пары ключ / значение. Хотя карты не являются коллекциями в правильном использовании этого термина, но они полностью интегрированы с коллекциями.

Коллекция интерфейсов

Каркас коллекций определяет несколько интерфейсов. В этом разделе представлен обзор каждого интерфейса —

Sr.No. Интерфейс и описание
1 Интерфейс Коллекции

Это позволяет вам работать с группами объектов; это находится наверху иерархии коллекций.

2 Интерфейс списка

Это расширяет коллекцию, а экземпляр List хранит упорядоченную коллекцию элементов.

3 Набор

Это расширяет коллекцию для обработки наборов, которые должны содержать уникальные элементы.

4 SortedSet

Это расширяет набор для обработки отсортированных наборов.

5 Карта

Это сопоставляет уникальные ключи со значениями.

6 Карта. Вход

Это описывает элемент (пара ключ / значение) в карте. Это внутренний класс Map.

7 Сортированная карта

Это расширяет карту, так что ключи поддерживаются в порядке возрастания.

8 Перечисление

Это устаревший интерфейс, определяющий методы, с помощью которых вы можете перечислять (получать по одному) элементы в коллекции объектов. Этот устаревший интерфейс был заменен Iterator.

Это позволяет вам работать с группами объектов; это находится наверху иерархии коллекций.

Это расширяет коллекцию, а экземпляр List хранит упорядоченную коллекцию элементов.

Это расширяет коллекцию для обработки наборов, которые должны содержать уникальные элементы.

Это расширяет набор для обработки отсортированных наборов.

Это сопоставляет уникальные ключи со значениями.

Это описывает элемент (пара ключ / значение) в карте. Это внутренний класс Map.

Это расширяет карту, так что ключи поддерживаются в порядке возрастания.

Это устаревший интерфейс, определяющий методы, с помощью которых вы можете перечислять (получать по одному) элементы в коллекции объектов. Этот устаревший интерфейс был заменен Iterator.

Коллекционные классы

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

Стандартные классы коллекции представлены в следующей таблице:

Sr.No. Класс и описание
1

AbstractCollection

Реализует большую часть интерфейса коллекции.

2

AbstractList

Расширяет AbstractCollection и реализует большую часть интерфейса List.

3

AbstractSequentialList

Расширяет AbstractList для использования коллекцией, которая использует последовательный, а не произвольный доступ к своим элементам.

4 LinkedList

Реализует связанный список, расширяя AbstractSequentialList.

5 ArrayList

Реализует динамический массив путем расширения AbstractList.

6

AbstractSet

Расширяет AbstractCollection и реализует большую часть интерфейса Set.

7 HashSet

Расширяет AbstractSet для использования с хеш-таблицей.

8 LinkedHashSet

Расширяет HashSet, чтобы разрешить итерации порядка вставки.

9 TreeSet

Реализует набор, хранящийся в дереве. Расширяет AbstractSet.

10

AbstractMap

Реализует большую часть интерфейса карты.

11 HashMap

Расширяет AbstractMap для использования хэш-таблицы.

12 TreeMap

Расширяет AbstractMap для использования дерева.

13 WeakHashMap

Расширяет AbstractMap для использования хеш-таблицы со слабыми ключами.

14 LinkedHashMap

Расширяет HashMap, чтобы разрешить итерации порядка вставки.

15 IdentityHashMap

Расширяет AbstractMap и использует равенство ссылок при сравнении документов.

AbstractCollection

Реализует большую часть интерфейса коллекции.

AbstractList

Расширяет AbstractCollection и реализует большую часть интерфейса List.

AbstractSequentialList

Расширяет AbstractList для использования коллекцией, которая использует последовательный, а не произвольный доступ к своим элементам.

Реализует связанный список, расширяя AbstractSequentialList.

Реализует динамический массив путем расширения AbstractList.

AbstractSet

Расширяет AbstractCollection и реализует большую часть интерфейса Set.

Расширяет AbstractSet для использования с хеш-таблицей.

Расширяет HashSet, чтобы разрешить итерации порядка вставки.

Реализует набор, хранящийся в дереве. Расширяет AbstractSet.

AbstractMap

Реализует большую часть интерфейса карты.

Расширяет AbstractMap для использования хэш-таблицы.

Расширяет AbstractMap для использования дерева.

Расширяет AbstractMap для использования хеш-таблицы со слабыми ключами.

Расширяет HashMap, чтобы разрешить итерации порядка вставки.

Расширяет AbstractMap и использует равенство ссылок при сравнении документов.

Классы AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList и AbstractMap предоставляют скелетные реализации интерфейсов базовой коллекции, чтобы минимизировать усилия, необходимые для их реализации.

Следующие унаследованные классы, определенные java.util, обсуждались в предыдущей главе:

Sr.No. Класс и описание
1 Вектор

Это реализует динамический массив. Он похож на ArrayList, но с некоторыми отличиями.

2 стек

Стек является подклассом Vector, который реализует стандартный стек «первым пришел — первым вышел».

3 толковый словарь

Словарь — это абстрактный класс, который представляет хранилище ключей / значений и работает так же, как и Map.

4 Хеш-таблица

Hashtable был частью оригинального java.util и является конкретной реализацией словаря.

5 свойства

Свойства является подклассом Hashtable. Он используется для ведения списков значений, в которых ключ является строкой, а значение также является строкой.

6 BitSet

Класс BitSet создает специальный тип массива, который содержит значения битов. Этот массив может увеличиваться в размере по мере необходимости.

Это реализует динамический массив. Он похож на ArrayList, но с некоторыми отличиями.

Стек является подклассом Vector, который реализует стандартный стек «первым пришел — первым вышел».

Словарь — это абстрактный класс, который представляет хранилище ключей / значений и работает так же, как и Map.

Hashtable был частью оригинального java.util и является конкретной реализацией словаря.

Свойства является подклассом Hashtable. Он используется для ведения списков значений, в которых ключ является строкой, а значение также является строкой.

Класс BitSet создает специальный тип массива, который содержит значения битов. Этот массив может увеличиваться в размере по мере необходимости.

Алгоритмы сбора

Каркас коллекций определяет несколько алгоритмов, которые можно применять к коллекциям и картам. Эти алгоритмы определены как статические методы в классе Collections.

Некоторые из методов могут генерировать исключение ClassCastException , возникающее при попытке сравнить несовместимые типы, или исключение UnsupportedOperationException , возникающее при попытке изменить неизменяемую коллекцию.

Коллекции определяют три статические переменные: EMPTY_SET, EMPTY_LIST и EMPTY_MAP. Все неизменны.

Sr.No. Алгоритм и описание
1 Алгоритмы сбора

Вот список всех реализаций алгоритма.

Вот список всех реализаций алгоритма.

Как использовать итератор?

Часто вам захочется перебрать элементы коллекции. Например, вы можете отобразить каждый элемент.

Самый простой способ сделать это — использовать итератор, который является объектом, реализующим интерфейс Iterator или ListIterator.

Итератор позволяет циклически проходить через коллекцию, получать или удалять элементы. ListIterator расширяет Iterator, чтобы разрешить двунаправленный обход списка и модификацию элементов.

Sr.No. Метод итератора и описание
1 Использование Java Iterator

Вот список всех методов с примерами, предоставленными интерфейсами Iterator и ListIterator.

Вот список всех методов с примерами, предоставленными интерфейсами Iterator и ListIterator.

Как использовать компаратор?

TreeSet и TreeMap хранят элементы в отсортированном порядке. Однако именно компаратор точно определяет, что означает отсортированный порядок .

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

Sr.No. Метод итератора и описание
1 Использование Java Comparator

Вот список всех методов с примерами, предоставленными интерфейсом Comparator.

Вот список всех методов с примерами, предоставленными интерфейсом Comparator.

Резюме

Инфраструктура коллекций Java предоставляет программисту доступ к предварительно упакованным структурам данных, а также к алгоритмам управления ими.

Коллекция — это объект, который может содержать ссылки на другие объекты. Интерфейсы коллекции объявляют операции, которые могут быть выполнены для каждого типа коллекции.

Классы и интерфейсы каркаса коллекций находятся в пакете java.util.

Java — Generics

Было бы хорошо, если бы мы могли написать единственный метод сортировки, который мог бы сортировать элементы в массиве Integer, массиве String или массиве любого типа, который поддерживает порядок.

Java Универсальные методы и универсальные классы позволяют программистам указывать с помощью одного объявления метода набор связанных методов или с помощью одного объявления класса набор связанных типов соответственно.

Обобщения также обеспечивают безопасность типов во время компиляции, что позволяет программистам перехватывать недопустимые типы во время компиляции.

Используя концепцию Java Generic, мы могли бы написать универсальный метод для сортировки массива объектов, а затем вызвать универсальный метод с массивами Integer, Double-массивами, массивами String и т. Д. Для сортировки элементов массива.

Общие методы

Вы можете написать одно объявление универсального метода, которое можно вызывать с аргументами разных типов. Основываясь на типах аргументов, передаваемых универсальному методу, компилятор обрабатывает каждый вызов метода соответствующим образом. Ниже приведены правила для определения общих методов —

  • Все объявления обобщенных методов имеют раздел параметров типа, ограниченный угловыми скобками (<и>), который предшествует типу возврата метода (<E> в следующем примере).

  • Каждый раздел параметров типа содержит один или несколько параметров типа, разделенных запятыми. Параметр типа, также известный как переменная типа, является идентификатором, который задает имя общего типа.

  • Параметры типа могут использоваться для объявления возвращаемого типа и использования в качестве заполнителей для типов аргументов, передаваемых универсальному методу, которые известны как фактические аргументы типа.

  • Тело универсального метода объявляется как тело любого другого метода. Обратите внимание, что параметры типа могут представлять только ссылочные типы, а не примитивные типы (такие как int, double и char).

Все объявления обобщенных методов имеют раздел параметров типа, ограниченный угловыми скобками (<и>), который предшествует типу возврата метода (<E> в следующем примере).

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

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

Тело универсального метода объявляется как тело любого другого метода. Обратите внимание, что параметры типа могут представлять только ссылочные типы, а не примитивные типы (такие как int, double и char).

пример

Следующий пример иллюстрирует, как мы можем напечатать массив другого типа, используя один общий метод —

Live Demo

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }

   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

      System.out.println("Array integerArray contains:");
      printArray(intArray);   // pass an Integer array

      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray);   // pass a Double array

      System.out.println("\nArray characterArray contains:");
      printArray(charArray);   // pass a Character array
   }
}

Это даст следующий результат —

Выход

Array integerArray contains:
1 2 3 4 5 

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

Параметры ограниченного типа

Могут возникнуть ситуации, когда вы захотите ограничить типы типов, которые разрешено передавать в параметр типа. Например, метод, который работает с числами, может хотеть принимать только экземпляры Number или его подклассов. Это то, для чего предназначены параметры ограниченного типа.

Чтобы объявить параметр ограниченного типа, укажите имя параметра типа, затем ключевое слово extends и его верхнюю границу.

пример

Следующий пример иллюстрирует, как extends используется в общем смысле для обозначения «extends» (как в классах) или «Implements» (как в интерфейсах). Этот пример — универсальный метод для возврата самого большого из трех сопоставимых объектов —

Live Demo

public class MaximumTest {
   // determines the largest of three Comparable objects
   
   public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
      T max = x;   // assume x is initially the largest
      
      if(y.compareTo(max) > 0) {
         max = y;   // y is the largest so far
      }
      
      if(z.compareTo(max) > 0) {
         max = z;   // z is the largest now                 
      }
      return max;   // returns the largest object   
   }
   
   public static void main(String args[]) {
      System.out.printf("Max of %d, %d and %d is %d\n\n", 
         3, 4, 5, maximum( 3, 4, 5 ));

      System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
         6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));

      System.out.printf("Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum("pear", "apple", "orange"));
   }
}

Это даст следующий результат —

Выход

Max of 3, 4 and 5 is 5

Max of 6.6,8.8 and 7.7 is 8.8

Max of pear, apple and orange is pear

Универсальные классы

Объявление универсального класса выглядит как объявление неуниверсального класса, за исключением того, что за именем класса следует раздел параметра типа.

Как и в случае универсальных методов, раздел параметров типа универсального класса может иметь один или несколько параметров типа, разделенных запятыми. Эти классы известны как параметризованные классы или параметризованные типы, потому что они принимают один или несколько параметров.

пример

Следующий пример иллюстрирует, как мы можем определить универсальный класс —

Live Demo

public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }

   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();
    
      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));

      System.out.printf("Integer Value :%d\n\n", integerBox.get());
      System.out.printf("String Value :%s\n", stringBox.get());
   }
}

Это даст следующий результат —

Выход

Integer Value :10
String Value :Hello World

Java — Сериализация

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

После того, как сериализованный объект был записан в файл, его можно прочитать из файла и десериализовать, то есть информацию о типе и байты, которые представляют объект и его данные, можно использовать для воссоздания объекта в памяти.

Наиболее впечатляет то, что весь процесс независим от JVM, то есть объект может быть сериализован на одной платформе и десериализован на совершенно другой платформе.

Классы ObjectInputStream и ObjectOutputStream — это высокоуровневые потоки, которые содержат методы для сериализации и десериализации объекта.

Класс ObjectOutputStream содержит много методов записи для записи различных типов данных, но особенно выделяется один метод —

public final void writeObject(Object x) throws IOException

Вышеуказанный метод сериализует объект и отправляет его в выходной поток. Аналогично, класс ObjectInputStream содержит следующий метод десериализации объекта:

public final Object readObject() throws IOException, ClassNotFoundException

Этот метод извлекает следующий объект из потока и десериализует его. Возвращаемое значение — Object, поэтому вам необходимо привести его к соответствующему типу данных.

Чтобы продемонстрировать, как сериализация работает в Java, я собираюсь использовать класс Employee, который мы обсуждали в начале книги. Предположим, что у нас есть следующий класс Employee, который реализует интерфейс Serializable —

пример

public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

Обратите внимание, что для успешной сериализации класса должны быть выполнены два условия:

  • Класс должен реализовывать интерфейс java.io.Serializable.

  • Все поля в классе должны быть сериализуемыми. Если поле не сериализуемо, оно должно быть помечено как временное .

Класс должен реализовывать интерфейс java.io.Serializable.

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

Если вам интересно узнать, можно ли сериализовать стандартный класс Java, проверьте документацию по этому классу. Тест прост: если класс реализует java.io.Serializable, то он сериализуем; в противном случае это не так.

Сериализация объекта

Класс ObjectOutputStream используется для сериализации объекта. Следующая программа SerializeDemo создает экземпляр объекта Employee и сериализует его в файл.

Когда выполнение программы завершено, создается файл с именем employee.ser. Программа не генерирует никаких выходных данных, но изучает код и пытается определить, что делает программа.

Примечание. При сериализации объекта в файл стандартное соглашение в Java — дать файлу расширение .ser .

пример

import java.io.*;
public class SerializeDemo {

   public static void main(String [] args) {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      
      try {
         FileOutputStream fileOut =
         new FileOutputStream("/tmp/employee.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(e);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in /tmp/employee.ser");
      } catch (IOException i) {
         i.printStackTrace();
      }
   }
}

Десериализация объекта

Следующая программа DeserializeDemo десериализует объект Employee, созданный в программе SerializeDemo. Изучите программу и попытайтесь определить ее результат —

пример

import java.io.*;
public class DeserializeDemo {

   public static void main(String [] args) {
      Employee e = null;
      try {
         FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         e = (Employee) in.readObject();
         in.close();
         fileIn.close();
      } catch (IOException i) {
         i.printStackTrace();
         return;
      } catch (ClassNotFoundException c) {
         System.out.println("Employee class not found");
         c.printStackTrace();
         return;
      }
      
      System.out.println("Deserialized Employee...");
      System.out.println("Name: " + e.name);
      System.out.println("Address: " + e.address);
      System.out.println("SSN: " + e.SSN);
      System.out.println("Number: " + e.number);
   }
}

Это даст следующий результат —

Выход

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Вот следующие важные моменты, которые следует отметить —

  • Блок try / catch пытается перехватить исключение ClassNotFoundException, которое объявляется методом readObject (). Чтобы JVM могла десериализовать объект, она должна найти байт-код для класса. Если JVM не может найти класс во время десериализации объекта, она генерирует исключение ClassNotFoundException.

  • Обратите внимание, что возвращаемое значение readObject () приведено к ссылке Employee.

  • Значение поля SSN было 11122333, когда объект был сериализован, но поскольку поле является временным, это значение не было отправлено в выходной поток. Поле SSN десериализованного объекта Employee равно 0.

Блок try / catch пытается перехватить исключение ClassNotFoundException, которое объявляется методом readObject (). Чтобы JVM могла десериализовать объект, она должна найти байт-код для класса. Если JVM не может найти класс во время десериализации объекта, она генерирует исключение ClassNotFoundException.

Обратите внимание, что возвращаемое значение readObject () приведено к ссылке Employee.

Значение поля SSN было 11122333, когда объект был сериализован, но поскольку поле является временным, это значение не было отправлено в выходной поток. Поле SSN десериализованного объекта Employee равно 0.

Java — Сеть

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

Пакет java.net API-интерфейсов J2SE содержит набор классов и интерфейсов, которые предоставляют подробные сведения о низкоуровневом взаимодействии, что позволяет вам писать программы, ориентированные на решение проблемы.

Пакет java.net обеспечивает поддержку двух общих сетевых протоколов:

  • TCP — TCP означает Протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP / IP.

  • UDP — UDP означает User Datagram Protocol, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.

TCP — TCP означает Протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP / IP.

UDP — UDP означает User Datagram Protocol, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.

Эта глава дает хорошее понимание следующих двух тем:

  • Программирование на сокете — это наиболее широко используемая концепция в сети, и она была подробно объяснена.

  • Обработка URL — это будет рассмотрено отдельно. Нажмите здесь, чтобы узнать об обработке URL на языке Java.

Программирование на сокете — это наиболее широко используемая концепция в сети, и она была подробно объяснена.

Обработка URL — это будет рассмотрено отдельно. Нажмите здесь, чтобы узнать об обработке URL на языке Java.

Программирование сокетов

Сокеты обеспечивают механизм связи между двумя компьютерами, использующими TCP. Клиентская программа создает сокет на своем конце связи и пытается подключить этот сокет к серверу.

Когда соединение установлено, сервер создает объект сокета на своем конце связи. Клиент и сервер теперь могут общаться, записывая и считывая данные из сокета.

Класс java.net.Socket представляет собой сокет, а класс java.net.ServerSocket предоставляет механизм для серверной программы для прослушивания клиентов и установления соединений с ними.

Следующие шаги выполняются при установлении соединения TCP между двумя компьютерами с использованием сокетов:

  • Сервер создает экземпляр объекта ServerSocket, определяющий, по какому номеру порта должна происходить связь.

  • Сервер вызывает метод accept () класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу по указанному порту.

  • После ожидания сервера клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.

  • Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный связываться с сервером.

  • На стороне сервера метод accept () возвращает ссылку на новый сокет на сервере, который подключен к клиентскому сокету.

Сервер создает экземпляр объекта ServerSocket, определяющий, по какому номеру порта должна происходить связь.

Сервер вызывает метод accept () класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу по указанному порту.

После ожидания сервера клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.

Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный связываться с сервером.

На стороне сервера метод accept () возвращает ссылку на новый сокет на сервере, который подключен к клиентскому сокету.

После того, как соединения установлены, связь может происходить с использованием потоков ввода / вывода. Каждый сокет имеет и OutputStream, и InputStream. OutputStream клиента подключен к InputStream сервера, а InputStream клиента подключен к OutputStream сервера.

TCP является двусторонним протоколом связи, поэтому данные могут передаваться по обоим потокам одновременно. Ниже приведены полезные классы, предоставляющие полный набор методов для реализации сокетов.

Методы класса ServerSocket

Класс java.net.ServerSocket используется серверными приложениями для получения порта и прослушивания клиентских запросов.

Класс ServerSocket имеет четыре конструктора —

Sr.No. Метод и описание
1

public ServerSocket (int port) выдает IOException

Попытки создать серверный сокет, связанный с указанным портом. Исключение происходит, если порт уже связан другим приложением.

2

public ServerSocket (int port, int backlog) выдает IOException

Как и в предыдущем конструкторе, параметр backlog указывает, сколько входящих клиентов нужно сохранить в очереди ожидания.

3

public ServerSocket (int port, int backlog, адрес InetAddress) выбрасывает IOException

Как и в предыдущем конструкторе, параметр InetAddress указывает локальный IP-адрес для привязки. InetAddress используется для серверов, которые могут иметь несколько IP-адресов, что позволяет серверу указывать, по какому из его IP-адресов принимать запросы клиентов.

4

public ServerSocket () выбрасывает IOException

Создает несвязанный сокет сервера. При использовании этого конструктора используйте метод bind (), когда будете готовы связать сокет сервера.

public ServerSocket (int port) выдает IOException

Попытки создать серверный сокет, связанный с указанным портом. Исключение происходит, если порт уже связан другим приложением.

public ServerSocket (int port, int backlog) выдает IOException

Как и в предыдущем конструкторе, параметр backlog указывает, сколько входящих клиентов нужно сохранить в очереди ожидания.

public ServerSocket (int port, int backlog, адрес InetAddress) выбрасывает IOException

Как и в предыдущем конструкторе, параметр InetAddress указывает локальный IP-адрес для привязки. InetAddress используется для серверов, которые могут иметь несколько IP-адресов, что позволяет серверу указывать, по какому из его IP-адресов принимать запросы клиентов.

public ServerSocket () выбрасывает IOException

Создает несвязанный сокет сервера. При использовании этого конструктора используйте метод bind (), когда будете готовы связать сокет сервера.

Если конструктор ServerSocket не выдает исключение, это означает, что ваше приложение успешно связано с указанным портом и готово для клиентских запросов.

Ниже приведены некоторые из распространенных методов класса ServerSocket.

Sr.No. Метод и описание
1

public int getLocalPort ()

Возвращает порт, который прослушивает сокет сервера. Этот метод полезен, если вы передали 0 в качестве номера порта в конструкторе и позволили серверу найти порт для вас.

2

public Socket accept () выдает IOException

Ждет входящего клиента. Этот метод блокируется до тех пор, пока клиент не подключится к серверу на указанном порту или не истечет время ожидания сокета, при условии, что значение времени ожидания было установлено с помощью метода setSoTimeout (). В противном случае этот метод блокируется на неопределенный срок.

3

public void setSoTimeout (int timeout)

Устанавливает значение времени ожидания для того, как долго сокет сервера ожидает клиента во время accept ().

4

public void bind (хост SocketAddress, int backlog)

Связывает сокет с указанным сервером и портом в объекте SocketAddress. Используйте этот метод, если вы создали экземпляр ServerSocket с помощью конструктора без аргументов.

public int getLocalPort ()

Возвращает порт, который прослушивает сокет сервера. Этот метод полезен, если вы передали 0 в качестве номера порта в конструкторе и позволили серверу найти порт для вас.

public Socket accept () выдает IOException

Ждет входящего клиента. Этот метод блокируется до тех пор, пока клиент не подключится к серверу на указанном порту или не истечет время ожидания сокета, при условии, что значение времени ожидания было установлено с помощью метода setSoTimeout (). В противном случае этот метод блокируется на неопределенный срок.

public void setSoTimeout (int timeout)

Устанавливает значение времени ожидания для того, как долго сокет сервера ожидает клиента во время accept ().

public void bind (хост SocketAddress, int backlog)

Связывает сокет с указанным сервером и портом в объекте SocketAddress. Используйте этот метод, если вы создали экземпляр ServerSocket с помощью конструктора без аргументов.

Когда ServerSocket вызывает accept (), метод не возвращается, пока клиент не подключится. После того, как клиент все-таки подключится, ServerSocket создает новый сокет для неуказанного порта и возвращает ссылку на этот новый сокет. Теперь между клиентом и сервером существует TCP-соединение, и связь может начаться.

Методы класса сокета

Класс java.net.Socket представляет собой сокет, который клиент и сервер используют для связи друг с другом. Клиент получает объект Socket, создав его экземпляр, тогда как сервер получает объект Socket из возвращаемого значения метода accept ().

Класс Socket имеет пять конструкторов, которые клиент использует для подключения к серверу.

Sr.No. Метод и описание
1

public Socket (String host, int port) генерирует исключение UnknownHostException, IOException.

Этот метод пытается подключиться к указанному серверу через указанный порт. Если этот конструктор не выдает исключение, соединение установлено успешно, и клиент подключен к серверу.

2

public Socket (InetAddress host, int port) выдает IOException

Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress.

3

public Socket (String host, int port, InetAddress localAddress, int localPort) выдает IOException.

Подключается к указанному хосту и порту, создавая сокет на локальном хосте по указанному адресу и порту.

4

public Socket (хост InetAddress, int-порт, InetAddress localAddress, int localPort) выдает IOException.

Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress вместо String.

5

общедоступный сокет ()

Создает неподключенный сокет. Используйте метод connect () для подключения этого сокета к серверу.

public Socket (String host, int port) генерирует исключение UnknownHostException, IOException.

Этот метод пытается подключиться к указанному серверу через указанный порт. Если этот конструктор не выдает исключение, соединение установлено успешно, и клиент подключен к серверу.

public Socket (InetAddress host, int port) выдает IOException

Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress.

public Socket (String host, int port, InetAddress localAddress, int localPort) выдает IOException.

Подключается к указанному хосту и порту, создавая сокет на локальном хосте по указанному адресу и порту.

public Socket (хост InetAddress, int-порт, InetAddress localAddress, int localPort) выдает IOException.

Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress вместо String.

общедоступный сокет ()

Создает неподключенный сокет. Используйте метод connect () для подключения этого сокета к серверу.

Когда конструктор Socket возвращается, он не просто создает экземпляр объекта Socket, но фактически пытается подключиться к указанному серверу и порту.

Некоторые методы, представляющие интерес для класса Socket, перечислены здесь. Обратите внимание, что и клиент, и сервер имеют объект Socket, поэтому эти методы могут вызываться как клиентом, так и сервером.

Sr.No. Метод и описание
1

public void connect (хост SocketAddress, int timeout) выдает IOException

Этот метод подключает сокет к указанному хосту. Этот метод необходим только при создании экземпляра Socket с помощью конструктора без аргументов.

2

public InetAddress getInetAddress ()

Этот метод возвращает адрес другого компьютера, к которому подключен этот сокет.

3

public int getPort ()

Возвращает порт, к которому привязан сокет на удаленной машине.

4

public int getLocalPort ()

Возвращает порт, к которому привязан сокет на локальной машине.

5

public SocketAddress getRemoteSocketAddress ()

Возвращает адрес удаленного сокета.

6

public InputStream getInputStream () генерирует IOException

Возвращает входной поток сокета. Входной поток подключен к выходному потоку удаленного сокета.

7

public OutputStream getOutputStream () бросает IOException

Возвращает выходной поток сокета. Выходной поток подключен к входному потоку удаленного сокета.

8

public void close () выбрасывает IOException

Закрывает сокет, что делает этот объект Socket больше не способным снова подключаться к любому серверу.

public void connect (хост SocketAddress, int timeout) выдает IOException

Этот метод подключает сокет к указанному хосту. Этот метод необходим только при создании экземпляра Socket с помощью конструктора без аргументов.

public InetAddress getInetAddress ()

Этот метод возвращает адрес другого компьютера, к которому подключен этот сокет.

public int getPort ()

Возвращает порт, к которому привязан сокет на удаленной машине.

public int getLocalPort ()

Возвращает порт, к которому привязан сокет на локальной машине.

public SocketAddress getRemoteSocketAddress ()

Возвращает адрес удаленного сокета.

public InputStream getInputStream () генерирует IOException

Возвращает входной поток сокета. Входной поток подключен к выходному потоку удаленного сокета.

public OutputStream getOutputStream () бросает IOException

Возвращает выходной поток сокета. Выходной поток подключен к входному потоку удаленного сокета.

public void close () выбрасывает IOException

Закрывает сокет, что делает этот объект Socket больше не способным снова подключаться к любому серверу.

Методы класса InetAddress

Этот класс представляет IP-адрес. Вот следующие полезные методы, которые вам понадобятся при программировании сокетов:

Sr.No. Метод и описание
1

статический InetAddress getByAddress (byte [] addr)

Возвращает объект InetAddress с учетом необработанного IP-адреса.

2

статический InetAddress getByAddress (String host, byte [] addr)

Создает InetAddress на основе предоставленного имени хоста и IP-адреса.

3

статический InetAddress getByName (Строка хоста)

Определяет IP-адрес хоста, учитывая имя хоста.

4

Строка getHostAddress ()

Возвращает строку IP-адреса в текстовом представлении.

5

Строка getHostName ()

Получает имя хоста для этого IP-адреса.

6

статический InetAddress InetAddress getLocalHost ()

Возвращает локальный хост.

7

Строка toString ()

Преобразует этот IP-адрес в строку.

статический InetAddress getByAddress (byte [] addr)

Возвращает объект InetAddress с учетом необработанного IP-адреса.

статический InetAddress getByAddress (String host, byte [] addr)

Создает InetAddress на основе предоставленного имени хоста и IP-адреса.

статический InetAddress getByName (Строка хоста)

Определяет IP-адрес хоста, учитывая имя хоста.

Строка getHostAddress ()

Возвращает строку IP-адреса в текстовом представлении.

Строка getHostName ()

Получает имя хоста для этого IP-адреса.

статический InetAddress InetAddress getLocalHost ()

Возвращает локальный хост.

Строка toString ()

Преобразует этот IP-адрес в строку.

Пример Socket Client

Следующий GreetingClient — это клиентская программа, которая подключается к серверу с помощью сокета и отправляет приветствие, а затем ожидает ответа.

пример

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Пример сокет-сервера

Следующая программа GreetingServer является примером серверного приложения, которое использует класс Socket для прослушивания клиентов по номеру порта, указанному в аргументе командной строки:

пример

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Скомпилируйте клиент и сервер, а затем запустите сервер следующим образом:

$ java GreetingServer 6066
Waiting for client on port 6066...

Проверьте клиентскую программу следующим образом —

Выход

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!

Java — отправка электронной почты

Для отправки электронной почты с использованием Java-приложения достаточно просто, но для начала на вашем компьютере должны быть установлены JavaMail API и Java Activation Framework (JAF) .

  • Вы можете загрузить последнюю версию JavaMail (Версия 1.2) со стандартного веб-сайта Java.

  • Вы можете загрузить последнюю версию JAF (Версия 1.1.1) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JavaMail (Версия 1.2) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JAF (Версия 1.1.1) со стандартного веб-сайта Java.

Загрузите и разархивируйте эти файлы, во вновь созданных каталогах верхнего уровня вы найдете несколько jar-файлов для обоих приложений. Вам необходимо добавить файлы mail.jar и активации.jar в ваш CLASSPATH.

Отправить простое электронное письмо

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

пример

// File Name SendEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail {

   public static void main(String [] args) {    
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Now set the actual message
         message.setText("This is actual message");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Скомпилируйте и запустите эту программу, чтобы отправить простое электронное письмо —

Выход

$ java SendEmail
Sent message successfully....

Если вы хотите отправить электронное письмо нескольким получателям, то для указания нескольких идентификаторов электронной почты будут использованы следующие методы:

void addRecipients(Message.RecipientType type, Address[] addresses)
   throws MessagingException

Вот описание параметров —

  • type — Это будет установлено в TO, CC или BCC. Здесь CC представляет Carbon Copy, а BCC представляет Black Carbon Copy. Пример: Message.RecipientType.TO

  • адреса — это массив адресов электронной почты. Вам нужно будет использовать метод InternetAddress () при указании идентификаторов электронной почты.

type — Это будет установлено в TO, CC или BCC. Здесь CC представляет Carbon Copy, а BCC представляет Black Carbon Copy. Пример: Message.RecipientType.TO

адреса — это массив адресов электронной почты. Вам нужно будет использовать метод InternetAddress () при указании идентификаторов электронной почты.

Отправить HTML письмо

Вот пример отправки электронной почты в формате HTML с вашего компьютера. Здесь предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправлять электронную почту.

Этот пример очень похож на предыдущий, за исключением того, что здесь мы используем метод setContent () для установки содержимого, вторым аргументом которого является «text / html», чтобы указать, что содержимое HTML включено в сообщение.

Используя этот пример, вы можете отправить настолько большой, насколько вам нравится, контент HTML.

пример

// File Name SendHTMLEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendHTMLEmail {

   public static void main(String [] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Send the actual HTML message, as big as you like
         message.setContent("<h1>This is actual message</h1>", "text/html");

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Скомпилируйте и запустите эту программу для отправки электронного письма в формате HTML —

Выход

$ java SendHTMLEmail
Sent message successfully....

Отправить вложение в E-mail

Вот пример, чтобы отправить электронное письмо с вложением с вашего компьютера. Здесь предполагается, что ваш локальный хост подключен к Интернету и достаточно способен отправлять электронную почту.

пример

// File Name SendFileEmail.java

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendFileEmail {

   public static void main(String [] args) {     
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      // Assuming you are sending email from localhost
      String host = "localhost";

      // Get system properties
      Properties properties = System.getProperties();

      // Setup mail server
      properties.setProperty("mail.smtp.host", host);

      // Get the default Session object.
      Session session = Session.getDefaultInstance(properties);

      try {
         // Create a default MimeMessage object.
         MimeMessage message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));

         // Set Subject: header field
         message.setSubject("This is the Subject Line!");

         // Create the message part 
         BodyPart messageBodyPart = new MimeBodyPart();

         // Fill the message
         messageBodyPart.setText("This is message body");
         
         // Create a multipar message
         Multipart multipart = new MimeMultipart();

         // Set text message part
         multipart.addBodyPart(messageBodyPart);

         // Part two is attachment
         messageBodyPart = new MimeBodyPart();
         String filename = "file.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);

         // Send the complete message parts
         message.setContent(multipart );

         // Send message
         Transport.send(message);
         System.out.println("Sent message successfully....");
      } catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }
}

Скомпилируйте и запустите эту программу для отправки электронного письма в формате HTML —

Выход

$ java SendFileEmail
Sent message successfully....

Часть аутентификации пользователя

Если для аутентификации требуется предоставить идентификатор пользователя и пароль для сервера электронной почты, вы можете установить эти свойства следующим образом:

props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");

Остальная часть механизма отправки электронной почты останется такой, как описано выше.

Java — многопоточность

Java — это многопоточный язык программирования, что означает, что мы можем разрабатывать многопоточные программы с использованием Java. Многопоточная программа содержит две или более частей, которые могут работать одновременно, и каждая из них может одновременно выполнять разные задачи, оптимально используя доступные ресурсы, особенно если на вашем компьютере установлено несколько процессоров.

По определению многозадачность — это когда несколько процессов совместно используют общие ресурсы обработки, такие как ЦП. Многопоточность расширяет идею многозадачности в приложениях, где вы можете разделить определенные операции в рамках одного приложения на отдельные потоки. Каждый из потоков может работать параллельно. ОС делит время обработки не только между различными приложениями, но и между каждым потоком в приложении.

Многопоточность позволяет вам писать так, чтобы несколько действий могли выполняться одновременно в одной и той же программе.

Жизненный цикл потока

Нить проходит через различные стадии своего жизненного цикла. Например, поток рождается, запускается, запускается, а затем умирает. Следующая диаграмма показывает полный жизненный цикл потока.

Нить Java

Ниже приведены этапы жизненного цикла —

  • Новый — новый поток начинает свой жизненный цикл в новом состоянии. Он остается в этом состоянии, пока программа не запустит поток. Это также упоминается как прирожденная нить .

  • Runnable — после запуска только что созданного потока поток становится работоспособным. Поток в этом состоянии считается выполняющим свою задачу.

  • Ожидание — иногда поток переходит в состояние ожидания, пока поток ожидает, пока другой поток выполнит задачу. Поток возвращается в состояние выполнения только тогда, когда другой поток сигнализирует ожидающему потоку о продолжении выполнения.

  • Временное ожидание — работающий поток может войти в состояние ожидания по времени в течение определенного интервала времени. Поток в этом состоянии возвращается в работоспособное состояние, когда истекает этот временной интервал или когда происходит ожидаемое событие.

  • Завершено (Dead) — работающий поток входит в завершенное состояние, когда он завершает свою задачу или иным образом завершает свою работу.

Новый — новый поток начинает свой жизненный цикл в новом состоянии. Он остается в этом состоянии, пока программа не запустит поток. Это также упоминается как прирожденная нить .

Runnable — после запуска только что созданного потока поток становится работоспособным. Поток в этом состоянии считается выполняющим свою задачу.

Ожидание — иногда поток переходит в состояние ожидания, пока поток ожидает, пока другой поток выполнит задачу. Поток возвращается в состояние выполнения только тогда, когда другой поток сигнализирует ожидающему потоку о продолжении выполнения.

Временное ожидание — работающий поток может войти в состояние ожидания по времени в течение определенного интервала времени. Поток в этом состоянии возвращается в работоспособное состояние, когда истекает этот временной интервал или когда происходит ожидаемое событие.

Завершено (Dead) — работающий поток входит в завершенное состояние, когда он завершает свою задачу или иным образом завершает свою работу.

Приоритеты потоков

Каждый поток Java имеет приоритет, который помогает операционной системе определять порядок, в котором запланированы потоки.

Приоритеты потоков Java находятся в диапазоне между MIN_PRIORITY (константа 1) и MAX_PRIORITY (константа 10). По умолчанию каждому потоку присваивается приоритет NORM_PRIORITY (константа 5).

Потоки с более высоким приоритетом более важны для программы и должны выделять процессорное время перед потоками с более низким приоритетом. Однако приоритеты потоков не могут гарантировать порядок выполнения потоков и очень сильно зависят от платформы.

Создайте поток, реализуя работающий интерфейс

Если ваш класс предназначен для выполнения в виде потока, вы можете добиться этого, реализуя интерфейс Runnable . Вам нужно будет выполнить три основных шага —

Шаг 1

В качестве первого шага вам необходимо реализовать метод run (), предоставляемый интерфейсом Runnable . Этот метод обеспечивает точку входа для потока, и вы поместите всю свою бизнес-логику в этот метод. Ниже приведен простой синтаксис метода run ():

public void run( )

Шаг 2

На втором этапе вы создадите экземпляр объекта Thread, используя следующий конструктор:

Thread(Runnable threadObj, String threadName);

Где threadObj — это экземпляр класса, который реализует интерфейс Runnable, а threadName — это имя, данное новому потоку.

Шаг 3

Как только объект Thread создан, вы можете запустить его, вызвав метод start () , который выполняет вызов метода run (). Ниже приведен простой синтаксис метода start ():

void start();

пример

Вот пример, который создает новый поток и запускает его:

Live Demo

class RunnableDemo implements Runnable {
   private Thread t;
   private String threadName;
   
   RunnableDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo R1 = new RunnableDemo( "Thread-1");
      R1.start();
      
      RunnableDemo R2 = new RunnableDemo( "Thread-2");
      R2.start();
   }   
}

Это даст следующий результат —

Выход

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

Создать поток, расширяя класс потока

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

Шаг 1

Вам нужно будет переопределить метод run (), доступный в классе Thread. Этот метод обеспечивает точку входа для потока, и вы поместите всю свою бизнес-логику в этот метод. Ниже приведен простой синтаксис метода run ():

public void run( )

Шаг 2

После создания объекта Thread его можно запустить, вызвав метод start () , который выполняет вызов метода run (). Ниже приведен простой синтаксис метода start ():

void start( );

пример

Вот предыдущая программа, переписанная для расширения темы —

Live Demo

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;
   
   ThreadDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      ThreadDemo T1 = new ThreadDemo( "Thread-1");
      T1.start();
      
      ThreadDemo T2 = new ThreadDemo( "Thread-2");
      T2.start();
   }   
}

Это даст следующий результат —

Выход

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

Методы потока

Ниже приведен список важных методов, доступных в классе Thread.

Sr.No. Метод и описание
1

public void start ()

Запускает поток по отдельному пути выполнения, затем вызывает метод run () для этого объекта Thread.

2

public void run ()

Если этот объект Thread был создан с использованием отдельной цели Runnable, метод run () вызывается для этого объекта Runnable.

3

публичный финал void setName (имя строки)

Изменяет имя объекта Thread. Существует также метод getName () для получения имени.

4

public final void setPriority (int priority)

Устанавливает приоритет этого объекта Thread. Возможные значения от 1 до 10.

5

публичный финал void setDaemon (логическое значение включено)

Параметр true обозначает этот поток как поток демона.

6

публичное окончание void join (длинный миллисек)

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

7

public void interrupt ()

Прерывает этот поток, заставляя его продолжить выполнение, если он был заблокирован по какой-либо причине.

8

открытый финальный логический isAlive ()

Возвращает true, если поток активен, что происходит в любое время после запуска потока, но до его завершения.

public void start ()

Запускает поток по отдельному пути выполнения, затем вызывает метод run () для этого объекта Thread.

public void run ()

Если этот объект Thread был создан с использованием отдельной цели Runnable, метод run () вызывается для этого объекта Runnable.

публичный финал void setName (имя строки)

Изменяет имя объекта Thread. Существует также метод getName () для получения имени.

public final void setPriority (int priority)

Устанавливает приоритет этого объекта Thread. Возможные значения от 1 до 10.

публичный финал void setDaemon (логическое значение включено)

Параметр true обозначает этот поток как поток демона.

публичное окончание void join (длинный миллисек)

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

public void interrupt ()

Прерывает этот поток, заставляя его продолжить выполнение, если он был заблокирован по какой-либо причине.

открытый финальный логический isAlive ()

Возвращает true, если поток активен, что происходит в любое время после запуска потока, но до его завершения.

Предыдущие методы вызываются для определенного объекта Thread. Следующие методы в классе Thread являются статическими. Вызов одного из статических методов выполняет операцию с текущим запущенным потоком.

Sr.No. Метод и описание
1

public static void yield ()

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

2

Публичный статический бессильный сон (длинный миллисек)

Заставляет текущий запущенный поток блокироваться как минимум на указанное количество миллисекунд.

3

public static boolean holdLock (Объект x)

Возвращает true, если текущий поток удерживает блокировку данного объекта.

4

публичный статический поток currentThread ()

Возвращает ссылку на текущий запущенный поток, который является потоком, который вызывает этот метод.

5

public static void dumpStack ()

Печатает трассировку стека для текущего запущенного потока, что полезно при отладке многопоточного приложения.

public static void yield ()

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

Публичный статический бессильный сон (длинный миллисек)

Заставляет текущий запущенный поток блокироваться как минимум на указанное количество миллисекунд.

public static boolean holdLock (Объект x)

Возвращает true, если текущий поток удерживает блокировку данного объекта.

публичный статический поток currentThread ()

Возвращает ссылку на текущий запущенный поток, который является потоком, который вызывает этот метод.

public static void dumpStack ()

Печатает трассировку стека для текущего запущенного потока, что полезно при отладке многопоточного приложения.

пример

Следующая программа ThreadClassDemo демонстрирует некоторые из этих методов класса Thread. Рассмотрим класс DisplayMessage, который реализует Runnable

// File Name : DisplayMessage.java
// Create a thread to implement Runnable

public class DisplayMessage implements Runnable {
   private String message;
   
   public DisplayMessage(String message) {
      this.message = message;
   }
   
   public void run() {
      while(true) {
         System.out.println(message);
      }
   }
}

Ниже приведен еще один класс, расширяющий класс Thread.

// File Name : GuessANumber.java
// Create a thread to extentd Thread

public class GuessANumber extends Thread {
   private int number;
   public GuessANumber(int number) {
      this.number = number;
   }
   
   public void run() {
      int counter = 0;
      int guess = 0;
      do {
         guess = (int) (Math.random() * 100 + 1);
         System.out.println(this.getName() + " guesses " + guess);
         counter++;
      } while(guess != number);
      System.out.println("** Correct!" + this.getName() + "in" + counter + "guesses.**");
   }
}

Ниже приводится основная программа, в которой используются определенные выше классы.

// File Name : ThreadClassDemo.java
public class ThreadClassDemo {

   public static void main(String [] args) {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
      
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();

      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try {
         thread3.join();
      } catch (InterruptedException e) {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
      
      thread4.start();
      System.out.println("main() is ending...");
   }
}

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

Выход

Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......

Основные многопоточные концепции Java

При многопоточном программировании на Java вам понадобятся следующие концепции:

Что такое синхронизация потоков?

Обработка межпотокового общения

Обработка нити тупиковая

Основные операции с потоками

Java — Основы апплета

Апплет — это Java-программа, которая запускается в веб-браузере. Апплет может быть полнофункциональным Java-приложением, поскольку в его распоряжении находится весь Java API.

Между апплетом и автономным Java-приложением есть несколько важных отличий, включая следующие:

  • Апплет — это класс Java, который расширяет класс java.applet.Applet.

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

  • Апплеты предназначены для встраивания в HTML-страницу.

  • Когда пользователь просматривает HTML-страницу, которая содержит апплет, код для апплета загружается на компьютер пользователя.

  • JVM требуется для просмотра апплета. JVM может быть подключаемым модулем веб-браузера или отдельной средой выполнения.

  • JVM на компьютере пользователя создает экземпляр класса апплета и вызывает различные методы в течение жизни апплета.

  • Апплеты имеют строгие правила безопасности, которые применяются веб-браузером. Безопасность апплета часто упоминается как безопасность песочницы, сравнивая апплет с ребенком, играющим в песочнице с различными правилами, которые необходимо соблюдать.

  • Другие классы, в которых нуждается апплет, могут быть загружены в один файл Java Archive (JAR).

Апплет — это класс Java, который расширяет класс java.applet.Applet.

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

Апплеты предназначены для встраивания в HTML-страницу.

Когда пользователь просматривает HTML-страницу, которая содержит апплет, код для апплета загружается на компьютер пользователя.

JVM требуется для просмотра апплета. JVM может быть подключаемым модулем веб-браузера или отдельной средой выполнения.

JVM на компьютере пользователя создает экземпляр класса апплета и вызывает различные методы в течение жизни апплета.

Апплеты имеют строгие правила безопасности, которые применяются веб-браузером. Безопасность апплета часто упоминается как безопасность песочницы, сравнивая апплет с ребенком, играющим в песочнице с различными правилами, которые необходимо соблюдать.

Другие классы, в которых нуждается апплет, могут быть загружены в один файл Java Archive (JAR).

Жизненный цикл апплета

Четыре метода в классе Applet дают вам основу для построения любого серьезного апплета —

  • init — Этот метод предназначен для любой инициализации, необходимой для вашего апплета. Он вызывается после обработки тегов param внутри тега applet.

  • start — этот метод вызывается автоматически после того, как браузер вызывает метод init. Он также вызывается всякий раз, когда пользователь возвращается на страницу, содержащую апплет, после перехода на другие страницы.

  • stop — этот метод вызывается автоматически, когда пользователь покидает страницу, на которой находится апплет. Поэтому его можно вызывать повторно в одном и том же апплете.

  • уничтожить — этот метод вызывается только тогда, когда браузер выключается нормально. Поскольку апплеты предназначены для жизни на HTML-странице, обычно не следует оставлять ресурсы после того, как пользователь покидает страницу, содержащую апплет.

  • paint — вызывается сразу после метода start (), а также в любое время, когда апплет должен перерисовать себя в браузере. Метод paint () фактически унаследован от java.awt.

init — Этот метод предназначен для любой инициализации, необходимой для вашего апплета. Он вызывается после обработки тегов param внутри тега applet.

start — этот метод вызывается автоматически после того, как браузер вызывает метод init. Он также вызывается всякий раз, когда пользователь возвращается на страницу, содержащую апплет, после перехода на другие страницы.

stop — этот метод вызывается автоматически, когда пользователь покидает страницу, на которой находится апплет. Поэтому его можно вызывать повторно в одном и том же апплете.

уничтожить — этот метод вызывается только тогда, когда браузер выключается нормально. Поскольку апплеты предназначены для жизни на HTML-странице, обычно не следует оставлять ресурсы после того, как пользователь покидает страницу, содержащую апплет.

paint — вызывается сразу после метода start (), а также в любое время, когда апплет должен перерисовать себя в браузере. Метод paint () фактически унаследован от java.awt.

Апплет «Привет, мир»

Ниже приведен простой апплет с именем HelloWorldApplet.java —

import java.applet.*;
import java.awt.*;

public class HelloWorldApplet extends Applet {
   public void paint (Graphics g) {
      g.drawString ("Hello World", 25, 50);
   }
}

Эти операторы импорта переносят классы в область действия нашего класса апплета —

  • java.applet.Applet
  • java.awt.Graphics

Без этих операторов импорта компилятор Java не распознал бы классы Applet и Graphics, на которые ссылается класс applet.

Апплет Класс

Каждый апплет является расширением класса java.applet.Applet . Базовый класс Applet предоставляет методы, которые производный класс Applet может вызывать для получения информации и услуг из контекста браузера.

К ним относятся методы, которые делают следующее —

  • Получить параметры апплета
  • Получить сетевое расположение файла HTML, который содержит апплет
  • Получить сетевое расположение каталога класса апплета
  • Распечатать сообщение о состоянии в браузере
  • Получить изображение
  • Получить аудиоклип
  • Воспроизвести аудиоклип
  • Изменить размер апплета

Кроме того, класс Applet предоставляет интерфейс, с помощью которого средство просмотра или браузер получает информацию об апплете и контролирует выполнение апплета. Зритель может —

  • Запрос информации об авторе, версии и авторских правах апплета
  • Запросить описание параметров, которые распознает апплет
  • Инициализировать апплет
  • Уничтожить апплет
  • Запустить выполнение апплета
  • Остановить выполнение апплета

Класс Applet предоставляет реализации по умолчанию для каждого из этих методов. Эти реализации могут быть переопределены при необходимости.

Апплет «Hello, World» завершен. Единственный переопределенный метод — метод рисования.

Вызов апплета

Апплет может быть вызван встраиванием директив в файл HTML и просмотром файла через средство просмотра апплета или браузер с поддержкой Java.

Тег <applet> является основой для встраивания апплета в файл HTML. Ниже приведен пример, который вызывает апплет «Hello, World» —

<html>
   <title>The Hello, World Applet</title>
   <hr>
   <applet code = "HelloWorldApplet.class" width = "320" height = "120">
      If your browser was Java-enabled, a "Hello, World"
      message would appear here.
   </applet>
   <hr>
</html>

Примечание. Вы можете обратиться к тегу апплета HTML, чтобы узнать больше о вызове апплета из HTML.

Атрибут кода тега <applet> является обязательным. Он определяет класс Applet для запуска. Ширина и высота также необходимы для указания начального размера панели, в которой запускается апплет. Директива апплета должна быть закрыта тегом </ applet>.

Если апплет принимает параметры, значения можно передать для параметров, добавив теги <param> между <applet> и </ applet>. Браузер игнорирует текст и другие теги между тегами апплета.

Браузеры без поддержки Java не обрабатывают <applet> и </ applet>. Поэтому все, что появляется между тегами, не связанными с апплетом, видно в браузерах без поддержки Java.

Зритель или браузер ищет скомпилированный код Java в месте нахождения документа. Чтобы указать другое, используйте атрибут codebase тега <applet>, как показано ниже —

<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class"
   width = "320" height = "120">

Если апплет находится в пакете, отличном от пакета по умолчанию, в атрибуте кода необходимо указать удерживающий пакет, используя символ точки (.) Для разделения компонентов пакета / класса. Например —

<applet  = "mypackage.subpackage.TestApplet.class" 
   width = "320" height = "120">

Получение параметров апплета

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

Второй цвет и размер каждого квадрата могут быть указаны как параметры для апплета в документе.

CheckerApplet получает свои параметры в методе init (). Он также может получить свои параметры в методе paint (). Однако получить значения и сохранить настройки один раз в начале апплета, а не при каждом обновлении, удобно и эффективно.

Программа просмотра или браузер апплета вызывает метод init () каждого запускаемого им апплета. Зритель вызывает init () один раз, сразу после загрузки апплета. (Applet.init () реализован, чтобы ничего не делать.) Переопределите реализацию по умолчанию, чтобы вставить пользовательский код инициализации.

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

Ниже приведен скелет CheckerApplet.java —

import java.applet.*;
import java.awt.*;

public class CheckerApplet extends Applet {
   int squareSize = 50;   // initialized to default size
   public void init() {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

Вот методы CheckerApplet init () и private parseSquareSize () —

public void init () {
   String squareSizeParam = getParameter ("squareSize");
   parseSquareSize (squareSizeParam);
   
   String colorParam = getParameter ("color");
   Color fg = parseColor (colorParam);
   
   setBackground (Color.black);
   setForeground (fg);
}

private void parseSquareSize (String param) {
   if (param == null) return;
   try {
      squareSize = Integer.parseInt (param);
   } catch (Exception e) {
      // Let default value remain
   }
}

Апплет вызывает parseSquareSize () для анализа параметра squareSize. parseSquareSize () вызывает метод библиотеки Integer.parseInt (), который анализирует строку и возвращает целое число. Integer.parseInt () генерирует исключение всякий раз, когда его аргумент недопустим.

Поэтому parseSquareSize () перехватывает исключения, а не позволяет сбою апплета при неправильном вводе.

Апплет вызывает parseColor () для разбора параметра цвета в значение Color. parseColor () выполняет серию сравнений строк, чтобы сопоставить значение параметра с именем предопределенного цвета. Вам нужно реализовать эти методы, чтобы этот апплет работал.

Указание параметров апплета

Ниже приведен пример файла HTML со встроенным CheckerApplet. HTML-файл определяет оба параметра для апплета с помощью тега <param>.

<html>
   <title>Checkerboard Applet</title>
   <hr>
   <applet code = "CheckerApplet.class" width = "480" height = "320">
      <param name = "color" value = "blue">
      <param name = "squaresize" value = "30">
   </applet>
   <hr>
</html>

Примечание. Имена параметров не чувствительны к регистру.

Преобразование приложения в апплеты

Легко преобразовать графическое Java-приложение (то есть приложение, которое использует AWT и которое можно запустить с помощью средства запуска Java-программ) в апплет, который можно встроить в веб-страницу.

Ниже приведены конкретные шаги для преобразования приложения в апплет.

  • Создайте HTML-страницу с соответствующим тегом для загрузки кода апплета.

  • Поставьте подкласс класса JApplet. Сделайте этот класс публичным. В противном случае апплет не может быть загружен.

  • Исключите основной метод в приложении. Не создавайте рамочное окно для приложения. Ваше приложение будет отображаться внутри браузера.

  • Переместите любой код инициализации из конструктора окна фрейма в метод init апплета. Вам не нужно явно создавать объект апплета. Браузер создает его для вас и вызывает метод init.

  • Удалить вызов setSize; для апплетов изменение размера производится с помощью параметров ширины и высоты в файле HTML.

  • Удалить вызов setDefaultCloseOperation. Апплет не может быть закрыт; он завершается при выходе из браузера.

  • Если приложение вызывает setTitle, исключите вызов метода. Апплеты не могут иметь строки заголовка. (Конечно, вы можете озаглавить саму веб-страницу, используя тег заголовка HTML.)

  • Не вызывайте setVisible (true). Апплет отображается автоматически.

Создайте HTML-страницу с соответствующим тегом для загрузки кода апплета.

Поставьте подкласс класса JApplet. Сделайте этот класс публичным. В противном случае апплет не может быть загружен.

Исключите основной метод в приложении. Не создавайте рамочное окно для приложения. Ваше приложение будет отображаться внутри браузера.

Переместите любой код инициализации из конструктора окна фрейма в метод init апплета. Вам не нужно явно создавать объект апплета. Браузер создает его для вас и вызывает метод init.

Удалить вызов setSize; для апплетов изменение размера производится с помощью параметров ширины и высоты в файле HTML.

Удалить вызов setDefaultCloseOperation. Апплет не может быть закрыт; он завершается при выходе из браузера.

Если приложение вызывает setTitle, исключите вызов метода. Апплеты не могут иметь строки заголовка. (Конечно, вы можете озаглавить саму веб-страницу, используя тег заголовка HTML.)

Не вызывайте setVisible (true). Апплет отображается автоматически.

Обработка событий

Апплеты наследуют группу методов обработки событий из класса Container. Класс Container определяет несколько методов, таких как processKeyEvent и processMouseEvent, для обработки определенных типов событий, а затем один метод catch-all, называемый processEvent.

Чтобы отреагировать на событие, апплет должен переопределить соответствующий специфичный для события метод.

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;

public class ExampleEventHandling extends Applet implements MouseListener {
   StringBuffer strBuffer;

   public void init() {
      addMouseListener(this);
      strBuffer = new StringBuffer();
      addItem("initializing the apple ");
   }

   public void start() {
      addItem("starting the applet ");
   }

   public void stop() {
      addItem("stopping the applet ");
   }

   public void destroy() {
      addItem("unloading the applet");
   }

   void addItem(String word) {
      System.out.println(word);
      strBuffer.append(word);
      repaint();
   }

   public void paint(Graphics g) {
      // Draw a Rectangle around the applet's display area.
      g.drawRect(0, 0, 
      getWidth() - 1,
      getHeight() - 1);

      // display the string inside the rectangle.
      g.drawString(strBuffer.toString(), 10, 20);
   }

   
   public void mouseEntered(MouseEvent event) {
   }
   public void mouseExited(MouseEvent event) {
   }
   public void mousePressed(MouseEvent event) {
   }
   public void mouseReleased(MouseEvent event) {
   }
   public void mouseClicked(MouseEvent event) {
      addItem("mouse clicked! ");
   }
}

Теперь давайте назовем этот апплет следующим образом —

<html>
   <title>Event Handling</title>
   <hr>
   <applet code = "ExampleEventHandling.class" 
      width = "300" height = "300">
   </applet>
   <hr>
</html>

Первоначально, апплет отобразит «инициализация апплета. Запуск апплета». Затем, как только вы нажмете внутри прямоугольника, будет отображаться «щелчок мышью».

Отображение изображений

Апплет может отображать изображения в формате GIF, JPEG, BMP и других. Чтобы отобразить изображение в апплете, вы используете метод drawImage (), найденный в классе java.awt.Graphics.

Ниже приведен пример, иллюстрирующий все шаги, чтобы показать изображения —

import java.applet.*;
import java.awt.*;
import java.net.*;

public class ImageDemo extends Applet {
   private Image image;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String imageURL = this.getParameter("image");
      if(imageURL == null) {
         imageURL = "java.jpg";
      }
      try {
         URL url = new URL(this.getDocumentBase(), imageURL);
         image = context.getImage(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         // Display in browser status bar
         context.showStatus("Could not load image!");
      }
   }
   
   public void paint(Graphics g) {
      context.showStatus("Displaying image");
      g.drawImage(image, 0, 0, 200, 84, null);
      g.drawString("www.javalicense.com", 35, 100);
   }  
}

Теперь давайте назовем этот апплет следующим образом —

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "300" height = "200">
      <param name = "image" value = "java.jpg">
   </applet>
   <hr>
</html>

Воспроизведение аудио

Апплет может воспроизводить аудиофайл, представленный интерфейсом AudioClip в пакете java.applet. Интерфейс AudioClip имеет три метода, в том числе —

  • public void play () — воспроизводит аудиоклип один раз с начала.

  • public void loop () — Заставляет непрерывно воспроизводить аудиоклип.

  • public void stop () — останавливает воспроизведение аудиоклипа.

public void play () — воспроизводит аудиоклип один раз с начала.

public void loop () — Заставляет непрерывно воспроизводить аудиоклип.

public void stop () — останавливает воспроизведение аудиоклипа.

Чтобы получить объект AudioClip, вы должны вызвать метод getAudioClip () класса Applet. Метод getAudioClip () немедленно возвращает значение независимо от того, преобразуется ли URL в реальный аудиофайл. Аудиофайл не загружается до тех пор, пока не будет предпринята попытка воспроизвести аудиоклип.

Ниже приведен пример, иллюстрирующий все шаги для воспроизведения аудио —

import java.applet.*;
import java.awt.*;
import java.net.*;

public class AudioDemo extends Applet {
   private AudioClip clip;
   private AppletContext context;
   
   public void init() {
      context = this.getAppletContext();
      String audioURL = this.getParameter("audio");
      if(audioURL == null) {
         audioURL = "default.au";
      }
      try {
         URL url = new URL(this.getDocumentBase(), audioURL);
         clip = context.getAudioClip(url);
      } catch (MalformedURLException e) {
         e.printStackTrace();
         context.showStatus("Could not load audio file!");
      }
   }
   
   public void start() {
      if(clip != null) {
         clip.loop();
      }
   }
   
   public void stop() {
      if(clip != null) {
         clip.stop();
      }
   }
}

Теперь давайте назовем этот апплет следующим образом —

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "0" height = "0">
      <param name = "audio" value = "test.wav">
   </applet>
   <hr>
</html>

Вы можете использовать test.wav на вашем ПК для проверки приведенного выше примера.

Java — Комментарии к документации

Язык Java поддерживает три типа комментариев:

Sr.No. Комментарий и описание
1

/ * текст * /

Компилятор игнорирует все от / * до * /.

2

//текст

Компилятор игнорирует все от // до конца строки.

3

/** документация */

Это комментарий к документации и в целом его называют комментарием к документу . Инструмент JDK Javadoc использует комментарии к документам при подготовке автоматически сгенерированной документации.

/ * текст * /

Компилятор игнорирует все от / * до * /.

//текст

Компилятор игнорирует все от // до конца строки.

/** документация */

Это комментарий к документации и в целом его называют комментарием к документу . Инструмент JDK Javadoc использует комментарии к документам при подготовке автоматически сгенерированной документации.

Эта глава посвящена объяснению Javadoc. Мы увидим, как мы можем использовать Javadoc для создания полезной документации для кода Java.

Что такое Javadoc?

Javadoc — это инструмент, который поставляется с JDK и используется для генерации документации кода Java в формате HTML из исходного кода Java, для которого требуется документация в предопределенном формате.

Ниже приведен простой пример, где строки внутри /*….*/ являются многострочными комментариями Java. Аналогично, строка, которая предшествует //, является однострочным комментарием Java.

пример

/**
* The HelloWorld program implements an application that
* simply displays "Hello World!" to the standard output.
*
* @author  Zara Ali
* @version 1.0
* @since   2014-03-31 
*/
public class HelloWorld {

   public static void main(String[] args) {
      /* Prints Hello, World! on standard output.
      System.out.println("Hello World!");
   }
}

Вы можете включить необходимые теги HTML внутри части описания. Например, в следующем примере для заголовка используется <h1> …. </ h1>, а <p> использовался для создания разрыва абзаца —

пример

/**
* <h1>Hello, World!</h1>
* The HelloWorld program implements an application that
* simply displays "Hello World!" to the standard output.
* <p>
* Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
* 
*
* @author  Zara Ali
* @version 1.0
* @since   2014-03-31 
*/
public class HelloWorld {

   public static void main(String[] args) {
      /* Prints Hello, World! on standard output.
      System.out.println("Hello World!");
   }
}

Теги Javadoc

Инструмент Javadoc распознает следующие теги —

Тег Описание Синтаксис
@author Добавляет автора класса. @ имя автора текста
{@код} Отображает текст с использованием шрифта кода без интерпретации текста как разметки HTML или вложенных тегов Javadoc. {@ code text}
{} @DocRoot Представляет относительный путь к корневому каталогу сгенерированного документа с любой сгенерированной страницы. {} @DocRoot
@deprecated Добавляет комментарий, указывающий, что этот API больше не должен использоваться. @deprecated deprecatedtext
@exception Добавляет подзаголовок Throws к сгенерированной документации с именем класса и текстом описания. @exception class-name description
{} @InheritDoc Наследует комментарий от ближайшего наследуемого класса или реализуемого интерфейса. Наследует комментарий от непосредственного суперкласса.
{@ссылка на сайт} Вставляет встроенную ссылку с видимой текстовой меткой, которая указывает на документацию для указанного пакета, класса или имени члена ссылочного класса. {@link package.class # метка участника}
{} @Linkplain Идентичен {@link}, за исключением того, что ярлык ссылки отображается в виде обычного текста, а не шрифта кода. {@linkplain package.class # метка участника}
@param Добавляет параметр с указанным именем параметра, за которым следует указанное описание, в раздел «Параметры». @param имя параметра описание
@вернуть Добавляет раздел «Возвраты» с текстом описания. @ возвращение описание
@увидеть Добавляет заголовок «Смотрите также» со ссылкой или текстовой записью, которая указывает на ссылку. @ см. ссылку
@serial Используется в комментарии к документу для сериализуемого поля по умолчанию. @serial field-description | включить | исключать
@serialData Документирует данные, записанные методами writeObject () или writeExternal (). @serialData data-description
@serialField Документирует компонент ObjectStreamField. @serialField field-name field-type field-description
@поскольку Добавляет заголовок «С» с указанным текстом текста в созданную документацию. @ релиз
@throws Теги @throws и @exception являются синонимами. @ бросает описание имени класса
{@значение} Когда {@value} используется в комментариях к документу статического поля, он отображает значение этой константы. {@value package.class # field}
@версия Добавляет подзаголовок «Версия» с указанным текстом версии в сгенерированные документы, когда используется опция -version. @ версия-текст версии

пример

Следующая программа использует несколько важных тегов, доступных для комментариев к документации. Вы можете использовать другие теги в зависимости от ваших требований.

Документация по классу AddNum будет создана в HTML-файле AddNum.html, но в то же время будет также создан основной файл с именем index.html.

import java.io.*;

/**
* <h1>Add Two Numbers!</h1>
* The AddNum program implements an application that
* simply adds two given integer numbers and Prints
* the output on the screen.
* <p>
* <b>Note:</b> Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
*
* @author  Zara Ali
* @version 1.0
* @since   2014-03-31
*/
public class AddNum {
   /**
   * This method is used to add two integers. This is
   * a the simplest form of a class method, just to
   * show the usage of various javadoc Tags.
   * @param numA This is the first paramter to addNum method
   * @param numB  This is the second parameter to addNum method
   * @return int This returns sum of numA and numB.
   */
   public int addNum(int numA, int numB) {
      return numA + numB;
   }

   /**
   * This is the main method which makes use of addNum method.
   * @param args Unused.
   * @return Nothing.
   * @exception IOException On input error.
   * @see IOException
   */

   public static void main(String args[]) throws IOException {
      AddNum obj = new AddNum();
      int sum = obj.addNum(10, 20);

      System.out.println("Sum of 10 and 20 is :" + sum);
   }
}

Теперь обработайте вышеуказанный файл AddNum.java с помощью утилиты javadoc следующим образом:

$ javadoc AddNum.java
Loading source file AddNum.java...
Constructing Javadoc information...
Standard Doclet version 1.7.0_51
Building tree for all the packages and classes...
Generating /AddNum.html...
AddNum.java:36: warning - @return tag cannot be used in method with void return type.
Generating /package-frame.html...
Generating /package-summary.html...
Generating /package-tree.html...
Generating /constant-values.html...
Building index for all the packages and classes...
Generating /overview-tree.html...
Generating /index-all.html...
Generating /deprecated-list.html...
Building index for all classes...
Generating /allclasses-frame.html...
Generating /allclasses-noframe.html...
Generating /index.html...
Generating /help-doc.html...
1 warning
$

Вы можете проверить всю сгенерированную документацию здесь — AddNum . Если вы используете JDK 1.7, то javadoc не создает отличный файл stylesheet.css , поэтому мы предлагаем загрузить и использовать стандартную таблицу стилей с https://docs.oracle.com/javase/7/docs/api/stylesheet.css