Нажмите, если вам нравится проект. Ваш вклад сердечно приветствуется.
Многопоточность
Коллекции
Подключение к базе данных Java (JDBC)
Java-программы
Строковые методы Java
Страницы сервера Джакарты (JSP)
Сервлеты
Вопросы с несколькими вариантами ответов на Java
Шаблон проектирования Java
Спящий режим
Основы Spring Framework
Введение
Java-архитектура
Типы данных Java
Java-методы
Java Функциональное программирование
Java-лямбда-выражения
Java-классы
Java-конструкторы
Java-массив
Java-строки
Java-отражение
Java-потоки
Регулярные выражения Java
Обработка файлов Java
Исключения Java
Наследование Java
Переопределение метода Java
Полиморфизм Java
Java-абстракция
Java-интерфейсы
Java-инкапсуляция
Дженерики Java
Разнообразный
Методы интерфейса по умолчанию;
Лямбда-выражения;
Функциональные интерфейсы;
Ссылки на методы и конструкторы;
Повторяющиеся аннотации
Аннотации к типам данных;
Отражение параметров метода;
Stream API для работы с коллекциями;
Параллельная сортировка массивов;
Новый API для работы с датами и временем;
Новый движок JavaScript Nashorn;
Добавлено несколько новых классов для потокобезопасной работы;
Добавлен новый API для Calendar
и Locale
;
Добавлена поддержка Unicode 6.2.0;
Добавлен стандартный класс для работы с Base64;
Добавлена поддержка беззнаковой арифметики;
Улучшен конструктор java.lang.String(byte[], *)
и производительность метода java.lang.String.getBytes()
;
Новая реализация AccessController.doPrivileged
, позволяющая устанавливать подмножество привилегий без необходимости проверять * все остальные уровни доступа;
Алгоритмы на основе паролей стали более надежными;
Добавлена поддержка указания имени сервера SSL/TLS (NSI) в JSSE Server;
Улучшенное хранилище ключей (KeyStore);
Добавлен алгоритм SHA-224;
Удален мост JDBC — ODBC;
Убран PermGen, изменен метод хранения метаданных классов;
Возможность создания профилей для платформы Java SE, включающих не всю платформу, а некоторую ее часть;
Инструменты
Добавлена утилита jjs
для использования JavaScript Nashorn;
Команда java
может запускать приложения JavaFX;
Добавлена утилита jdeps
для анализа файлов .class.
↥ вернуться наверх
Nashorn — это движок JavaScript, разработанный Oracle на языке Java. Разработан для обеспечения возможности встраивания кода JavaScript в приложения Java. По сравнению с Rhino, который поддерживается Mozilla Foundation, Nashorn обеспечивает от 2 до 10 раз лучшую производительность, поскольку компилирует код и передает байт-код виртуальной машине Java непосредственно в памяти. Нашорн может компилировать код JavaScript и генерировать классы Java, которые загружаются с помощью специального загрузчика. Также возможно вызывать код Java непосредственно из JavaScript.
↥ вернуться наверх
jjs
— это утилита командной строки, позволяющая выполнять программы JavaScript прямо в консоли.
↥ вернуться наверх
В Java существует три различных способа чтения вводимых пользователем данных в среде командной строки (консоль).
1. Использование буферизованного класса чтения:
Этот метод используется путем упаковки System.in (стандартного потока ввода) в InputStreamReader, который заключен в BufferedReader. Мы можем читать вводимые пользователем данные в командной строке.
/** * Класс буферизованного чтения */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Test { public static void main(String[] args) throws IOException { // Enter данные с использованием BufferReader Читатель BufferedReader = новый BufferedReader (новый InputStreamReader (System.in)); // Чтение данных с помощью readLine String name = readLine.readLine(); // Печать строки чтения System.out.println(name); } }
2. Использование класса сканера:
Основная цель класса Scanner — анализ примитивных типов и строк с использованием регулярных выражений, однако его также можно использовать для чтения входных данных пользователя в командной строке.
/** * Класс сканера */import java.util.Scanner;class GetInputFromUser { public static void main(String args[]) { // Использование сканера для получения входных данных от пользовательского сканера in = new Scanner(System.in); Строка s = in.nextLine(); System.out.println("Вы ввели строку " + s); int a = in.nextInt(); System.out.println("Вы ввели целое число " + a); поплавок b = in.nextFloat(); System.out.println("Вы ввели число с плавающей запятой " + b); } }
3. Использование класса консоли:
Это становится предпочтительным способом чтения вводимых пользователем данных из командной строки. Кроме того, его можно использовать для чтения ввода, подобного паролю, без повторения символов, введенных пользователем; также можно использовать синтаксис строки формата (например, System.out.printf()).
/** * Класс консоли */public class Sample { public static void main(String[] args) { // Использование консоли для ввода данных от пользователя String name = System.console().readLine(); System.out.println(имя); } }
↥ вернуться наверх
Команда javap отображает информацию о полях, конструкторах и методах, присутствующих в файле класса. Команда javap (также известная как дизассемблер Java) дизассемблирует один или несколько файлов классов.
/** * Дизассемблер Java */class Simple { public static void main(String args[]) { System.out.println("Hello World"); } }
cmd> javap Simple.class
Выход
Скомпилировано из класса ".java" Simple { Простой(); public static void main(java.lang.String[]); }
↥ вернуться наверх
System.out::println
? Указанное выражение иллюстрирует передачу ссылки на статический метод класса println()
System.out
.
↥ вернуться наверх
Потоки могут быть последовательными и параллельными. Операции над последовательными потоками выполняются в одном потоке процессора, над параллельными потоками — с использованием нескольких потоков процессора. Параллельные потоки используют общий поток ForkJoinPool
через статический метод ForkJoinPool.commonPool()
. При этом, если среда не многоядерная, то поток будет выполняться как последовательный. Фактически использование параллельных потоков сводится к тому, что данные в потоках будут разделены на части, каждая часть обрабатывается на отдельном ядре процессора, и в конечном итоге эти части соединяются, и над ними выполняются конечные операции. их.
Вы также можете использовать метод интерфейса parallelStream()
для создания параллельного потока из коллекции Collection
.
Чтобы сделать обычный последовательный поток параллельным, вы должны вызвать метод Stream
объекта parallel()
. Метод isParallel()
позволяет узнать, является ли поток параллельным.
С помощью методов parallel()
и sequential()
можно определить, какие операции могут быть параллельными, а какие только последовательными. Вы также можете сделать параллельный поток из любого последовательного потока и наоборот:
коллекция .транслировать () .peek( ... ) // операция последовательная .параллельно () .map( ... ) // операция может выполняться параллельно, .последовательный () .reduce( ... ) // операция снова последовательная
Как правило, элементы передаются в поток в том же порядке, в котором они определены в источнике данных. При работе с параллельными потоками система сохраняет последовательность элементов. Исключением является метод forEach()
, который может выводить элементы в случайном порядке. А чтобы поддерживать порядок, необходимо применить метод forEachOrdered()
.
Критерии, которые могут повлиять на производительность в параллельных потоках:
Размер данных — чем больше данных, тем сложнее сначала разделить данные, а затем объединить их.
Количество ядер процессора. Теоретически, чем больше ядер в компьютере, тем быстрее будет работать программа. Если машина имеет одно ядро, использовать параллельные потоки нет смысла.
Чем проще структура данных, с которой работает поток, тем быстрее будут выполняться операции. Например, данные из ArrayList
удобны в использовании, поскольку структура этой коллекции предполагает последовательность несвязанных между собой данных. Но коллекция типов LinkedList
— не лучший вариант, так как в последовательном списке все элементы связаны предыдущим/следующим. И такие данные сложно распараллелить.
Операции с примитивными типами будут происходить быстрее, чем с объектами классов.
Настоятельно не рекомендуется использовать параллельные потоки для каких-либо длительных операций (например, сетевых подключений), поскольку все параллельные потоки работают с одним ForkJoinPool
, такие длинные операции могут остановить все параллельные потоки в JVM из-за отсутствия доступных потоков. в бассейне и т. д. параллельные потоки следует использовать только для коротких операций, где счет идет на миллисекунды, но не для тех, где счет может идти на секунды и минуты;
Сохранение заказа в параллельных потоках увеличивает затраты на выполнение, а если порядок не важен, то можно отключить его сохранение и тем самым повысить производительность, используя промежуточную операцию unordered()
:
коллекция.parallelStream() .сортировано () .неупорядоченный () .collect(Коллекторы.toList());
↥ вернуться наверх
Виртуальная машина Java (JVM) — это спецификация, предоставляющая среду выполнения, в которой может выполняться байт-код Java (файлы .class). JVM — это платформа. JVM действует как «виртуальная» машина или процессор. Независимость платформы Java в основном заключается в виртуальной машине Java (JVM). JVM делает это возможным, поскольку он знает о конкретной длине инструкций и других особенностях платформы (операционной системы).
JVM не является независимой от платформы. Виртуальная машина Java (JVM) предоставляет среду для выполнения файла Java (файла класса). Итак, в конце концов, это зависит от ядра, а ядро отличается от ОС (операционной системы) к ОС. JVM используется как для перевода байт-кода на машинный язык конкретного компьютера, так и для фактического выполнения соответствующих инструкций на машинном языке.
↥ вернуться наверх
Компилятор Just-In-Time (JIT) — это компонент среды выполнения, который повышает производительность приложений Java за счет компиляции байт-кодов в собственный машинный код во время выполнения.
Программы Java состоят из классов, которые содержат нейтральные к платформе байт-коды, которые могут интерпретироваться JVM на многих различных компьютерных архитектурах. Во время выполнения JVM загружает файлы классов, определяет семантику каждого отдельного байт-кода и выполняет соответствующие вычисления. Дополнительное использование процессора и памяти во время интерпретации означает, что приложение Java работает медленнее, чем собственное приложение. JIT-компилятор помогает повысить производительность программ Java путем компиляции байт-кодов в собственный машинный код во время выполнения. JIT-компилятор включен по умолчанию. Когда метод скомпилирован, JVM напрямую вызывает скомпилированный код этого метода, а не интерпретирует его.
↥ вернуться наверх
Java ClassLoader — это часть среды выполнения Java, которая динамически загружает классы Java в виртуальную машину Java. Код Java компилируется в файл класса с помощью компилятора Javac, а JVM выполняет программу Java, выполняя байт-коды, записанные в файле класса. ClassLoader отвечает за загрузку файлов классов из файловой системы, сети или любого другого источника.
Типы ClassLoader:
1. Загрузчик классов начальной загрузки :
Он загружает стандартные файлы классов JDK из rt.jar и других основных классов. Он загружает файлы классов из jre/lib/rt.jar. Например, класс пакета java.lang.
2. Загрузчик классов расширений :
Он загружает классы из расширений JDK напрямую, обычно это каталог JAVA_HOME/lib/ext
или любой другой каталог, например java.ext.dirs.
3. Загрузчик системных классов :
Он загружает специфичные для приложения классы из переменной среды CLASSPATH. Его можно установить при вызове программы с помощью параметров командной строки -cp или classpath.
↥ вернуться наверх
1. JDK :
Java Development Kit является основным компонентом среды Java и предоставляет все инструменты, исполняемые и двоичные файлы, необходимые для компиляции, отладки и выполнения Java-программы.
2. JVM :
JVM отвечает за преобразование байтового кода в код, специфичный для машины. JVM также зависит от платформы и предоставляет основные функции Java, такие как управление памятью, сбор мусора, безопасность и т. д. JVM можно настраивать, и мы можем использовать параметры Java для ее настройки, например, выделяя JVM минимальную и максимальную память. JVM называется виртуальной, потому что она предоставляет интерфейс, который не зависит от базовой операционной системы и аппаратного обеспечения машины.
2. JRE :
Среда выполнения Java предоставляет платформу для выполнения Java-программ. JRE состоит из двоичных файлов JVM и Java, а также других классов для успешного выполнения любой программы.
↥ вернуться наверх
1. Куча Java:
Пространство кучи Java используется средой выполнения Java для выделения памяти объектам и классам JRE . Всякий раз, когда мы создаем какой-либо объект, он всегда создается в куче.
Сборка мусора выполняется в куче, чтобы освободить память, используемую объектами, не имеющими ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него можно ссылаться из любой точки приложения.
2. Память стека Java:
Стек в Java — это раздел памяти, который содержит методы , локальные переменные и ссылочные переменные . Локальные переменные создаются в стеке.
Стековая память всегда используется в порядке LIFO (последний пришел-первым вышел). При каждом вызове метода в памяти стека создается новый блок для хранения локальных примитивных значений и ссылок на другие объекты в методе.
Как только метод завершается, блок становится неиспользуемым и становится доступным для следующего метода. Размер стековой памяти очень меньше по сравнению с кучной памятью.
Разница:
Параметр | Память стека | Куча пространства |
---|---|---|
Приложение | Стек используется частями, по одному во время выполнения потока. | Все приложение использует пространство кучи во время выполнения. |
Размер | Стек имеет ограничения по размеру в зависимости от ОС и обычно меньше кучи. | В куче нет ограничений по размеру |
Хранилище | Хранит только примитивные переменные и ссылки на объекты, созданные в куче. | Здесь хранятся все вновь созданные объекты. |
Заказ | Доступ к нему осуществляется с использованием системы распределения памяти «последним пришел — первым вышел» (LIFO). | Доступ к этой памяти осуществляется с помощью сложных методов управления памятью, включая молодое поколение, старое или постоянное поколение и постоянное поколение. |
Жизнь | Память стека существует только до тех пор, пока работает текущий метод. | Пространство кучи существует до тех пор, пока работает приложение. |
Эффективность | Сравнительно гораздо быстрее распределять память по сравнению с кучей. | Медленнее выделять по сравнению со стеком |
Распределение/освобождение | Эта память автоматически выделяется и освобождается, когда метод вызывается и возвращается соответственно. | Пространство кучи выделяется при создании новых объектов и освобождается сборщиком Gargabe, когда на них больше нет ссылок. |
↥ вернуться наверх
JVM — это программа, которая принимает байт-код Java и преобразует его (построчно) в понятный машине код. JVM выполняет некоторые конкретные типы операций:
Загрузка кода
Проверка кода
Выполнение кода
Он предоставляет пользователям среду выполнения
Типы областей памяти, выделяемых JVM:
1. Загрузчик классов . Загрузчик классов — это подсистема JVM, которая используется для загрузки файлов классов.
2. Область класса (метода) : область класса (метода) хранит структуры каждого класса, такие как пул констант времени выполнения, данные полей и методов, код для методов.
3. Куча : это область данных времени выполнения, в которой размещаются объекты.
4. Стек : Java Stack хранит кадры. Он содержит локальные переменные и частичные результаты и играет роль в вызове и возврате метода. Каждый поток имеет собственный стек JVM, создаваемый одновременно с потоком.
5. Регистр счетчика программ : регистр ПК (счетчик программ). Он содержит адрес инструкции виртуальной машины Java, выполняемой в данный момент.
6. Стек собственных методов : содержит все собственные методы, используемые в приложении.
↥ вернуться наверх
Автоматическое преобразование примитивных типов данных в эквивалентный тип Wrapper называется упаковкой, а обратная операция — распаковкой.
Пример: автобокс
/** * Автобокс */class BoxingExample { public static void main(String args[]) { int a = 50; Целое число a2 = новое целое число (a); // Целое число бокса a3 = 5; // Упаковка System.out.println(a2 + " " + a3); } }
Пример: распаковка
/** * Распаковка */class UnboxingExample { public static void main(String args[]) { Integer i = new Integer(50); интервал а = я; System.out.println(а); } }
↥ вернуться наверх
1. Переходный процесс:
Модификатор transient сообщает подсистеме сериализации объектов Java исключить поле при сериализации экземпляра класса. Когда объект затем десериализуется, поле будет инициализировано значением по умолчанию; т.е. значение null для ссылочного типа и ноль или false для примитивного типа.
Пример:
/** * Переходный процесс */public transient int limit = 55; // не будет persistpublic int b; // будет сохраняться
2. Неустойчивый:
Модификатор Летучий сообщает JVM, что записи в поле всегда должны синхронно сбрасываться в память, а операции чтения поля всегда должны считываться из памяти. Это означает, что к полям, помеченным как изменчивые, можно безопасно обращаться и обновлять их в многопоточном приложении без использования встроенной или стандартной синхронизации на основе библиотеки.
Пример:
/** * Volatile */public class MyRunnable реализует Runnable { Private Volatile boolean active; общественный недействительный запуск () {активный = правда; пока (активен) { } } Общественный недействительный стоп () {активный = ложь; } }
↥ вернуться наверх
Утверждение позволяет проверить правильность любых предположений, сделанных в программе. Утверждение достигается с помощью оператора Assert в Java.
При выполнении утверждения считается, что оно истинно. В случае неудачи JVM выдает ошибку с именем AssertionError
. В основном он используется в целях тестирования во время разработки.
Оператор Assert используется с логическим выражением и может быть записан двумя разными способами.
// Первый способ утверждения выражения; // Второй способ утверждения выражения1 : выражение2;
Пример:
/** * Утверждения */public class Пример { public static void main(String[] args) { int age = 14; утверждать возраст <= 18: «Невозможно проголосовать»; System.out.println("Возраст избирателя " + age); } }
↥ вернуться наверх
1. Конечная переменная:
Конечные переменные — это не что иное, как константы. Мы не можем изменить значение конечной переменной после ее инициализации.
Пример:
/** * Конечная переменная */class Demo { Final int MAX_VALUE = 99; недействительный myMethod () {MAX_VALUE = 101; } Public static void main(String args[]) {Demo obj = new Demo(); объект.мойМетод(); } }
Выход
Исключение в потоке «основной» java.lang.Error: неразрешенная проблема компиляции: Последнее поле Demo.MAX_VALUE нельзя назначить на сайте Beginnerbook.com.Demo.myMethod(Details.java:6) на сайте Beginnerbook.com.Demo.main(Details.java:10).
2. Пустая конечная переменная:
Конечная переменная, которая не инициализируется во время объявления, называется пустой финальной переменной. Мы должны инициализировать пустую конечную переменную в конструкторе класса, иначе она выдаст ошибку компиляции (Ошибка: variable MAX_VALUE might not have been initialized
).
Пример:
/** * Пустая конечная переменная */class Demo { // Пустая конечная переменная Final int MAX_VALUE; Demo() { // Он должен быть инициализирован в конструкторе MAX_VALUE = 100; } void myMethod() { System.out.println(MAX_VALUE); } Public static void main(String args[]) {Demo obj = new Demo(); объект.мойМетод(); } }
Выход
100
3. Последний метод:
Последний метод не может быть переопределен. Это означает, что хотя подкласс может без проблем вызвать последний метод родительского класса, но он не может его переопределить.
Пример:
/** * Финальный метод */class XYZ { Final void demo() { System.out.println("Метод класса XYZ"); } }class ABC расширяет XYZ { void demo() { System.out.println("Метод класса ABC"); } Public static void main(String args[]) {ABC obj = new ABC(); объект.демо(); } }
↥ вернуться наверх
Если примитивный тип или строка определена как константа и значение известно во время компиляции, компилятор заменяет имя константы повсюду в коде ее значением. Это называется константой времени компиляции.
Постоянная времени компиляции должна быть:
Объявлен окончательным
Примитив или строка
Инициализировано в объявлении
Инициализируется постоянным выражением
Они заменяются фактическими значениями во время компиляции, поскольку компилятор заранее знает их значение, а также знает, что его нельзя изменить во время выполнения.
частный финал int x = 10;
↥ вернуться наверх
Спецификаторы/модификаторы доступа помогают ограничить область действия класса, конструктора, переменной, метода или элемента данных.
В Java доступно четыре типа модификаторов доступа:
default
— ключевое слово не требуется, если класс, конструктор, переменная, метод или элемент данных объявлен без какого-либо спецификатора доступа, тогда он имеет область доступа по умолчанию, т. е. доступен только в пределах одного и того же пакета.
private
— если он объявлен как частный, область доступа ограничена внутри включающего класса.
protected
— если объявлено как защищенное, область доступа ограничивается классами, подклассами из того же пакета, а также другими пакетами.
public
— если он объявлен как общедоступный, он доступен везде в программе.
... /* переменные-члены данных */ String firstName="Pradeep"; /* область действия по умолчанию */ protected isValid=true; /* защищенная область */ Private String otp="AB0392"; /* частная область действия */ public int id = 12334; /* общедоступная область действия */ ... ... /* функции-члены данных */ String getFirstName(){ return this.firstName; } /* область по умолчанию */ protected boolean getStatus(){this.isValid;} /* защищенная область */ Private voidgenerOtp(){ /* частная область */ this.otp = this.hashCode() << 16; }; public int getId() { return this.id; } /* общедоступная область действия */ ... .../* внутренние классы */ class A{} /* область действия по умолчанию */ protected class B{} /* защищенная область действия */ частный класс C{} /* частная область действия */ общедоступный класс D{} /* общедоступная область действия */ ...
↥ вернуться наверх
В Java все нестатические методы по умолчанию являются виртуальными функциями . Невиртуальными являются только методы, отмеченные ключевым словом final
, которые нельзя переопределить, а также private methods
, которые не наследуются.
Пример: виртуальная функция с интерфейсом
/** * Функция applyBrakes() является виртуальной, поскольку * функции в интерфейсах предназначены для переопределения. **/interface Bicycle { void applyBrakes(); }class ACMEBicycle реализует Bicycle { public void applyBrakes() { // Здесь мы реализуем applyBrakes() System.out.println("Тормоза применены"); // функция } }
↥ вернуться наверх
Собственный метод — это метод Java (метод экземпляра или метод класса), реализация которого также написана на другом языке программирования, например C/C++. Более того, метод, помеченный как нативный, не может иметь тела и должен заканчиваться точкой с запятой:
Главный.java:
общественный класс Main {общественный родной int intMethod (int i); public static void main(String[] args) { System.loadLibrary("Main"); System.out.println(новый Main().intMethod(2)); } }
Главный.c:
#include <jni.h>#include "Main.h" JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, jobject obj, jint i) { return i * i; }
Скомпилируйте и запустите:
javac Main.javajavah -jni Maingcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Main.cjava -Djava.library.path=. Основной
Выход
4
↥ вернуться наверх
Если метод объявлен как статический, он является членом класса, а не объектом класса. Его можно вызвать без создания объекта класса. Статический метод также имеет возможность доступа к статическим членам данных класса.
На статический метод наложено несколько ограничений.
Статический метод не может использовать нестатический элемент данных или напрямую вызывать нестатический метод.
this
и super
не могут использоваться в статическом контексте.
Статический метод может получить доступ только к данным статического типа (переменная экземпляра статического типа).
Нет необходимости создавать объект класса для вызова статического метода.
Статический метод не может быть переопределен в подклассе
Пример:
/** * Статические методы */class Parent { static void display() { System.out.println("Суперкласс"); } } Пример публичного класса расширяет Parent { void display() // пытаемся переопределить display() { System.out.println("Sub class"); } public static void main(String[] args) { Родительский объект = новый Пример(); объект.дисплей(); } }
Это генерирует ошибку времени компиляции. Результат следующий:
Пример.java:10: ошибка: display() в примере не может переопределить display() в Parentvoid display() // попытка переопределить display() ^переопределенный метод — это ошибка static1
↥ вернуться наверх
Какова структура и особенности использования лямбда-выражения? Лямбда — это набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызывать в разных местах программы.
Основой лямбда-выражения является лямбда-оператор , который представляет собой стрелку ->
. Этот оператор делит лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая фактически представляет собой тело лямбда-выражения, в котором выполняются все действия.
Лямбда-выражение не выполняется само по себе, а формирует реализацию метода, определенного в функциональном интерфейсе. Важно, чтобы функциональный интерфейс содержал только один единственный метод без реализации.
интерфейс Operationable { int Calculate ( int x , int y ); } public static void main ( String [] args) {Работоспособная операция = (x, y) -> x + y; int result = Operation.calculate (10, 20); System.out.println (результат); // 30 }
Фактически, лямбда-выражения в некотором роде являются сокращенной формой внутренних анонимных классов, которые ранее использовались в Java.
Отложенное выполнение лямбда-выражения — определяется один раз в одном месте программы, вызывается при необходимости любое количество раз и в любом месте программы.
Параметры лямбда-выражения должны по типу соответствовать параметрам метода функционального интерфейса:
Operation = ( int x, int y) -> x + y; // При написании самого лямбда-выражения тип параметра допускается не указывать: (x, y) -> x + y; // Если метод не принимает никаких параметров, то пишутся пустые скобки, например: () -> 30 + 20 ;// Если метод принимает только один параметр, то скобки можно опустить: n -> n * n;
Завершающие лямбда-выражения не обязаны возвращать какое-либо значение.
интерфейс Printable {void print(String s); } public static void main ( String [] args) {принтер для печати = s -> System.out.println(s); print.print("Привет, мир"); }// _Блочные лямбда-выражения_ заключены в фигурные скобки. Модульные лямбда-выражения можно использовать внутри вложенных блоков, циклов, разрабатывать оператор if if, создавать переменные и т. д. д. Если вы блокируете лямбда-выражение, оно должно возвращать значение, оно явно применяет `оператор возврата оператора': Операционная операция = ( int x, int y) -> { если (y == 0) {вернуть 0; } Еще {возврат х/у; } };
Передача лямбда-выражения в качестве параметра метода
Условие интерфейса {boolean isAppropriate (int n); }private static int sum (int [] числа, условие условия) { int result = 0 ; for ( int i : Numbers) { if (condition.isAppropriate(i)) { result + = i; } } вернуть результат; }public static void main ( String [] args) { System.out.println(sum (new int [] { 0 , 1 , 0 , 3 , 0 , 5 , 0 , 7 , 0 , 9 }, (n) - > п = 0 )); }
↥ вернуться наверх
Доступ к переменным внешней области из лямбда-выражения очень похож на доступ из анонимных объектов.
неизменяемые (фактически окончательные – не обязательно помеченные как окончательные) локальные переменные;
поля класса
статические переменные.
Доступ к методам по умолчанию реализованного функционального интерфейса внутри лямбда-выражения запрещен.
↥ вернуться наверх
Если существующий в классе метод уже делает все необходимое, то для прямой передачи этого метода можно использовать механизм ссылки на метод (ссылку на метод). Результат будет точно такой же, как и в случае определения лямбда-выражения, вызывающего этот метод.
Пример:
частный интерфейс Measurable {public int length (String string); } public static void main ( String [] args) { Measurable a = String::length; System.out.println(a.length("abc")); }
Ссылки на методы потенциально более эффективны, чем использование лямбда-выражений. Кроме того, они предоставляют компилятору более подробную информацию о типе, и если вы можете выбирать между использованием ссылки на существующий метод и использованием лямбда-выражения, вам всегда следует использовать ссылку на метод.
↥ вернуться наверх
по статическому методу;
метод каждого экземпляра;
к конструктору.
↥ вернуться наверх
Вложенный внутренний класс может получить доступ к любой частной переменной экземпляра внешнего класса. Как и любая другая переменная экземпляра, мы можем иметь модификатор доступа Private, Protected, Public и модификатор по умолчанию.
Пример:
/** * Внутренний класс */class Outer { класс Внутренний { общественное недействительное шоу () { System.out.println("В методе вложенного класса"); } } } класс Главный { public static void main(String[] args) { Outer.Inner in = новый Outer().new Inner(); в.шоу(); } }
Подкласс — это класс, который наследует метод или методы от суперкласса.
Пример:
/** * Подкласс */class Car { //...} класс HybridCar расширяет автомобиль { //...}
↥ вернуться наверх
1. Статическая загрузка классов:
Создание объектов и экземпляров с использованием new
ключевого слова называется загрузкой статического класса. Получение определения класса и создание экземпляра объекта выполняется во время компиляции.
Пример:
/** * Статическая загрузка классов */class TestClass { public static void main(String args[]) { TestClass tc = new TestClass(); } }
2. Динамическая загрузка классов:
Для загрузки классов используется метод Class.forName()
. Динамическая загрузка классов выполняется, когда имя класса неизвестно во время компиляции.
Пример:
/** * Динамическая загрузка классов */Class.forName (String className);
↥ вернуться наверх
1. Класс времени выполнения:
Класс java.lang.Runtime является подклассом класса Object и обеспечивает доступ к системе времени выполнения Java. Информация времени выполнения, такая как доступность памяти, вызов сборщика мусора и т. д.
Пример:
/** * Класс выполнения */public class RuntimeTest { статический класс Message расширяет поток { public void run() { System.out.println("Exit"); } } Public static void main(String[] args) { try { Runtime.getRuntime().addShutdownHook(new Message()); System.out.println("Программа запущена..."); System.out.println(" Подождите 5 секунд..."); Thread.sleep(5000); System.out.println("Программа завершена..."); } catch (Исключение е) { e.printStackTrace(); } } }
2. Класс системы:
Цель класса System — предоставить доступ к системным ресурсам. Он содержит доступность к стандартному вводу, выводу Standart, выводы ошибок, текущее время в миллисе, завершение приложения и т. Д.
↥ Вернуться к вершине
1. Использование нового ключевого слова:
Myobject object = new myObject ();
2. Использование class.forname ():
Myobject object = (myobject) class.forname ("subin.rnd.myobject"). Newinstance ();
3. Использование Clone ():
MyObject oreObject = new myObject (); myObject object = (myObject) notherobject.clone ();
4. Использование Deserialization Object:
ObjectInputStream inStream = new ObjectInputStream (anInputStream); myObject object = (myObject) inStream.readObject ();
↥ Вернуться к вершине
Необываемые объекты - это объекты, которые не меняются. Имтируемый объект Java должен иметь все его поля внутренних, частными окончательными полями. Он не должен реализовать какие -либо сетевые. Ему нужен конструктор, который берет значение для каждого отдельного поля.
Создание неизменного объекта:
Не добавляйте ни одного метода сеттера
Объявить все поля окончательным и частным
Если поле является изменчивым объектом, создайте его защитные копии для методов Getter
Если изменяемый объект, переданный в конструктор
Не позволяйте подклассам переопределять методы.
/** * Им неизбежный объект */public Class DateContainer {частная дата окончательной даты; public DateContainer () {this.date = new Date (); } public Date getDate () {return New Date (date.getTime ()); } }
↥ Вернуться к вершине
Необычный класс означает, что после создания объекта мы не можем изменить его контент. В Java все классы обертки (например, целое число, логический, байт, короткий) и класс струнных.
Правила создания неизменных классов:
Класс должен быть объявлен окончательным
Участники данных в классе должны быть объявлены как окончательный
Параметризованный конструктор
Метод Getter для всех переменных в нем
Нет сеттеров
/** * Им неизбежный класс */public final Class employee {final String pancardnumber; Public Employee (String PancardNumber) {this.pancardnumber = pancardNumber; } public String getPancardNumber () {return pancardNumber; } }
↥ Вернуться к вершине
Bootstrap ClassLoader является RepSsionble для загрузки стандартных файлов JDK классов от RT.JAR , и он является родителем всех загрузчиков классов в Java. В Java есть три типа встроенного класса-загрузчика:
1. Загрузчик начальной загрузки: он загружает внутренние классы JDK, как правило, загружает RT.JAR и другие основные классы, например Java.lang.* Classes
2. Загрузчик класса расширений: он загружает классы из каталога JDK Extensions, обычно $ Java_home/Lib/Ext Directory.
3. Системный класс Loader: он загружает классы из текущей группы ClassPath, которые можно установить при выборе программы с использованием параметров командной строки -CP или -ClassPath.
/** * classLoader */import java.util.logging.level; import java.util.logging.logger; public class classloadertest {public static void main (string args []) {try {// printing classloader этой системы класса .out.println ("classloader:" + classloadertest.class.getClassloader ()); // Попытка явно загрузить этот класс с помощью класса Extension Class Class.forname («Явно загружающая класс», true, classloadertest.class.getClassloader (). getParent ()); } catch (classnotfoundexception ex) {logger.getLogger (classLoadErtest.class.getName ()). log (level.severe, null, ex); } } }
↥ Вернуться к вершине
Разные способы создания объекта на Java
Использование нового ключевого слова:
Class objectReationExample {String antuctor; } открытый класс mainclass {public static void main (string [] args) {// здесь мы создаем объект JBT, используя новый ключевой словес obj = new ObjectReationExample (); } }
Использование нового экземпляра (отражение)
класс createObjectClass {static int j = 10; createObjectClass () {i = j ++; } int i; @OverridePublic String toString () {return "значение i:" + i; } } класс mainclass {public static void main (string [] args) {try {class cls = class.forname ("createObjectClass"); createObjectClass obj = (createObjectClass) cls.newinstance (); createObjectClass obj1 = (createObjectclass) cls.newinStance (); (); System.out.println (obj); System.out.println (obj1); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (instantiationException e) {e.printstacktrace (); } catch (allogalaccessexception e) {e.printstacktrace (); } } }
Использование клона:
Класс CreateObjectWithClone реализует клонируемый {@OverrideProtected Object Clone () бросает клоненотсупортедэкспрессии {return super.clone (); } int i; static int j = 10; createObjectWithClone () {i = j ++; } @OverridePublic String toString () {return "значение i:" + i; } } класс MainClass {public static void main (string [] args) {createObjectwithClone obj1 = new createObjectwithClone (); System.out.println (obj1); try {createObjectWithClone obj2 = (createObjectwithClone) obj1.clone (); System.out. println (obj2); } catch (clonenotsupportedException e) {e.printstacktrace (); } } }
Использование класса загрузчика
класс createObjectWithClassLoader {static int j = 10; createObjectWithClassLoader () {i = j ++; } int i; @OverridePublic String toString () {return "значение i:" + i; } } открытый класс MainClass {public static void main (string [] args) {createObjectwithClassloader obj = null; try {obj = (createObjectwithClassloder) New MainClass (). getClass () .GetClassLoader (). // должно использоваться полностью квалифицированное имя класса. } catch (instantiationException e) {e.printstacktrace (); } catch (allogalaccessexception e) {e.printstacktrace (); } catch (classnotfoundexception e) {e.printstacktrace (); } System.out.println (obj); } }
↥ Вернуться к вершине
Класс объектов - это родительский класс всех классов в Java по умолчанию.
Метод | Описание |
---|---|
публичный финальный класс getClass () | Возвращает объект класса класса этого объекта. Класс класс может быть дополнительно использоваться для получения метаданных этого класса. |
public int hashcode () | Возвращает номер хэшкода для этого объекта. |
Общественное логическое равное (объект obj) | сравнивает заданный объект с этим объектом. |
защищенный объект клон () бросает клоненотсупорт | Создает и возвращает точную копию (клон) этого объекта. |
public String toString () | Возвращает строковое представление этого объекта. |
Public Final void Notify () | Просыпается в одном потоке, ожидая монитора этого объекта. |
Public Final void notifyall () | Просыпается все потоки, ожидая монитора этого объекта. |
Общественное окончательное void wat (долгой тайм -аут) бросает прерывание | Приводит к тому, что текущий поток ожидает указанных миллисекундов, пока другой поток не уведет (вызывает notify () или notifyall () метод). |
Общественное окончательное ожидание (долгой тайм -аут, int nanos) бросает прерывания | Приводит к тому, что текущий поток ожидает указанных миллисекундов и наносекунд, пока другой поток не уведет (вызывает notify () или notifyall () метод). |
Общественное окончательное void wat () бросает прерывание | Приводит к тому, что текущий поток ожидает, пока другой поток не уведет (вызывает notify () или notifyall () метод). |
Защищенный void infintize () бросает бросание | вызывается коллекционером мусора до того, как объект собирается мусор. |
↥ Вернуться к вершине
Необязательное значение, Optional
- это контейнер для объекта, который может содержать или не содержать значение null
значения. Такая обертка является удобным средством профилактики