1. Имя переменной должно начинаться с буквы (маленькой) и состоять из букв (Unicode) цифр и символа подчеркивания «_». Технически возможно начать имя переменной также с «$» или «_», однако это запрещено соглашением по оформлению кода в Java (Java Code Conventions). Кроме того, символ доллара «$», по соглашению, никогда не используется вообще. В соответствии с соглашением имя переменной должно начинаться именно с маленькой буквы (с заглавной буквы начинаются имена классов). Пробелы при именовании переменных не допускаются.
2. Имя переменной не должно быть ключевым или зарезервированным словом языка Java.
3. Имя переменной чувствительно к регистру. newVariable и newvariable — разные имена.
4. При выборе имени переменных, следует использовать полные слова вместо загадочных аббревиатур. Это сделает ваш код более удобным для чтения и понимания. Во многих случаях это также сделает ваш код самодокументируемым.
5. Если выбранное вами имя переменной состоит только из одного слова — запишите его маленькими буквами. Если оно состоит из более чем одного слова, то отделяйте каждое последующее слово в имени переменной заглавной буквой. Например: superCounter, myDomesticAnimal
6. Если переменная сохраняет постоянное значение, то каждое слово следует писать заглавными буквами и отделять при помощи символа подчеркивания. Пример:static final int NUMBER_OF_HOURS_IN_A_DAY = 24
2. Динамическое и статическое назначение методов и свойств.. Способ вызова динамических и статических методов
Методы классов помечаются модификатором static не случайно – для них при компиляции программного кода действует статическое связывание. Это значит, что в контексте какого класса указано имя метода в исходном коде, на метод того класса в скомпилированном коде и ставится ссылка. То есть осуществляется связывание имени метода в месте вызова с исполняемым кодом этого метода. Иногда статическое связывание называют ранним связыванием, так как оно происходит на этапе компиляции программы. Статическое связывание в Java используется еще в одном случае – когда класс объявлен с модификатором final("финальный", "окончательный").
|
Методы объектов в Java являются динамическими, то есть для них действует динамическое связывание. Оно происходит на этапе выполнения программы непосредственно во время вызова метода, причем на этапе написания данного метода заранее неизвестно, из какого класса будет проведен вызов. Это определяется типом объекта, для которого работает данный код - какому классу принадлежит объект, из того класса вызывается метод. Такое связывание происходит гораздо позже того, как был скомпилирован код метода. Поэтому такой тип связывания часто называют поздним связыванием.
Программный код, основанный на вызове динамических методов, обладает свойством полиморфизма – один и тот же код работает по -разному в зависимости от того, объект какого типа его вызывает, но делает одни и те же вещи на уровне абстракции, относящейся к исходному коду метода.
№ 11.
1)
Типы в Java распределены на две категории: простые (примитивные) и [ссылочные (объектные)]. Простыми являются тип boolean и все числовые типы. Числовые типы распределяются на две категории целочисленные byte, short, int, long, char и числа с плавоющей точкой float и double.
int — основной целочисленный тип, используется в Java по умолчанию. Это значит что если вы пишете целое число оно будет рассматриваться компилятором как число типа int. Тип int наиболее удобен для компьютера из-за особенности конструкции вычислительных процессоров поэтому и используется по умолчанию. Используется в качестве счётчика циклов, индексов массивов и индексов символов в строках
|
long — целочисленный тип содержащий, можно сказать, бесконечное количество значений. Используется в случаях, где числа превосходят 2 миллиарда и стандартного int уже не хватает. Используется в повседневной жизни для создания уникальных значений.
byte — используется для передачи данных по сети, записи и чтения из файла. В математических операциях, как правило, не используется.
short — самый редко используемый тип в Java, может использоваться только в целях экономии памяти.
double — это числа с двойной точностью, максимально приближённые к заданным или полученным в результате вычислений значениям. Используется в Java для любых математических вычислений (квадратный корень, синус, косинус,..).
float — менее точный тип с плавающей точкой. Используется очень редко с целью экономии памяти
char — используется для представления символов. Символы преобразуются по таблице кодировки UTF-16. По большому счёту это все буквы, числа и специальные символы существующие на нашей планете. Каждому символу соответствует определённое число из таблицы и Java при виде этого числа в рамках типа char выводит его на экран как символ.
Операции
Над целочисленными типами
· операторы сравнения (>, <, >=, <=) и равенства (==, !=)
|
· унарные операторы (+, -)
· мультипликативные (*, /, %) и аддитивные (+, -) операторы
· инкремент (++) и декремент (--) в префиксной и постфиксной формах
· знаковые (>>, <<) и без знаковые (>>>) операторы сдвига
· побитовые операторы (~, &, ^, |)
· условный оператор (?:)
· оператор приведения типов
2)
Абстрактным называется класс, на основе которого не могут создаваться объекты. При этом наследники класса могут быть не абстрактными, на их основе объекты создавать, соответственно, можно. Для того, чтобы превратить класс в абстрактный перед его именем надо указать модификатор abstract.
Абстрактный метод — метод, который не имеет реализации. Если в классе есть хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.
Использование абстрактных классов и методов позволяет описать некую абстракцию, которая должна быть реализована в других классах. Например, мы можем создать абстрактный класс Fighter и объявить в нём абстрактный метод fight(). Т.к. стилей борьбы может быть много, то, например, для JudoFighter extends Fighter метод fight() будет описывать приемы в стиле дзюдо и т.д.
Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу. Т.е. доступ можно будет получить и не создавая объекта класса. Поля помеченные static инициализируются при инициализации класса. К примеру, Class.forName(«MyClass», true, currentClassLoader), где второй параметр указывает на необходимость проведение инициализации.
На методы, объявленные как static, накладывается ряд ограничений.
Они могут вызывать только другие статические методы.
Они должны осуществлять доступ только к статическим переменным.
Они не могут ссылаться на члены типа this или super
finalize() - метод, который помогает при сборке мусора. Метод, который вызывается перед тем, как объект будет уничтожен сборщиком мусора.Не должен быть использован для освобождения ресурсов вне оперативной памяти, потому что Java имеет лимитированное количество этих ресурсов.
Для метода. Метод помеченный при помощи final не может быть переопределен в классах. Значение локальных переменных, а так же параметров метода помеченных при помощи слова final не могут быть изменены после присвоения.
3) package MyPack;
import static java.lang.Math.*;
/**
*
* @author yoghurt
* @param Kat_a катет прямоугольного треугольника
* @param Kat_b катет прямоугольного треугольника
* @param Gip_c гипотенуза прямоугольного треугольника
*
*/
abstract class Treangle {
private double Kat_a;
private double Kat_b;
private double Gip_c;
//конструктор без параметров
public Treangle() {
this. Kat_a = this. Kat_b = this. Gip_c = 1;
}
//конструктор с параметрами
public Treangle(double Kat_a, double Kat_b, double Gip_c) {
this. Kat_a = Kat_a;
this. Kat_b = Kat_b;
this. Gip_c = Gip_c;
}
//конструктор копирования
public Treangle(Treangle other) {
this. Kat_a = other.Kat_a;
this. Kat_b = other.Kat_b;
this. Gip_c = other.Gip_c;
}
//сеттер катета Kat_a
public void setKat_a(double Kat_a) {
this. Kat_a = Kat_a;
}
// геттер катета Kat_a
public double getKat_a() {
return this. Kat_a;
}
//сеттер гипотенузы Gip_c
public void setGip_c(double Gip_c) {
this. Gip_c = Gip_c;
}
// геттер гипотенузы Gip_c
public double getGip_c() {
return this. Gip_c;
}
//сеттер катета Kat_b
public void setKat_b(double Kat_b) {
this. Kat_b = Kat_b;
}
// геттер катета Kat_b
public double getKat_b() {
return this. Kat_b;
}
abstract public double area();
abstract public double perimeter();
abstract public String show();
}
/**
*
* @author yoghurt
* класс расширяющий класс абстрактный класс треугольник
* данный класс представляет частный случай - прямоугольный треугольник
*
*/
class PTreangle extends Treangle {
//конструктор без параметров
public PTreangle() {
super ();
}
//конструктор с параметрами
public PTreangle(double Kat_a, double Kat_b, double Gip_c) {
super (Kat_a, Kat_b, Gip_c);
}
//конструктор копирования
public PTreangle(PTreangle other) {
super (other);
}
//логический метод для определения существования треугольника
//основанный на теореме Пифагора
public boolean is_a_triangle() {
if (sqrt((pow(super. getKat_a(), 2) + pow(super. getKat_b(), 2))) == super. getGip_c())
return true;
Else
return false;
}
@ Override // Аннотация говорящая о том, что этот метод переопределен
//метод расчета периметра треугольника
public double perimeter() {
return super. getKat_a() + super. getKat_b() + super. getGip_c();
}
@ Override // Аннотация говорящая о том, что этот метод переопределен
//метод для вывода сторон трегольника
public String show() {
return "Kat_a: " + getKat_a() +
" \n Kat_b: " + super. getKat_b() +
" \n Gip_c: " + super. getGip_c() + " \n ";
}
@ Override // Аннотация говорящая о том, что этот метод переопределен
//метод для получения площади треугольника
public double area() {
return 0.5 * super. getKat_a() * super. getKat_b();
}
}
/**
*
* @author yoghurt
* класс тестер для проверки корректности работы
* класса треугольник
*/
public class Test {
//статический метод для вывода данных о треугольнике
public static void show_test(PTreangle tr) {
System. out.println("Треугольник: \n " + tr.show());
System. out.println("Может ли существовать такой треугольник: " + tr.is_a_triangle());
System. out.println("Площадь треугольника: " + tr.area());
System. out.println("Периметр треугольника: " + tr.perimeter());
System. out.println();
}
public static void main(String [] args) {
PTreangle tr_1 = new PTreangle(3, 4, 5);
PTreangle tr_2 = new PTreangle(8, 10, 12);
PTreangle tr_3 = new PTreangle(tr_1);
PTreangle tr_4 = new PTreangle();
PTreangle tr_5 = tr_2;
show_test(tr_1);
show_test(tr_2);
show_test(tr_3);
show_test(tr_4);
show_test(tr_5);
}
}
№ 12.
1)
В спецификации примитивный тип char принадлежит к целочисленным типам (или integral types), но поскольку он играет немного другую роль, можно выделить для него собственную категорию. Его роль — представлять символы Unicode. Для хранения символов требуется 16 бит. Странно, ведь для представления символов основных языков (например, английского, французского, испанского) достаточно 8 бит. Но такая цена интернационализации. Unicode использует полный набор международных символов на всех известных языках мира.
2)
Пакет (package) — это некий контейнер, который используется для того, чтобы изолировать имена классов. Например, вы можете создать класс List, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть, если бы кто-нибудь еще создал класс с именем List. Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости.
Пространство имён — некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (то есть имён). Идентификатор, определенный в пространстве имён, ассоциируется с этим пространством. Один и тот же идентификатор может быть независимо определён в нескольких пространствах. Таким образом, значение, связанное с идентификатором, определённым в одном пространстве имён, может иметь (или не иметь) такое же значение, как и такой же идентификатор, определённый в другом пространстве.
После оператора package, но до любого определения классов в исходном Java-файле, может присутствовать список операторов import. Пакеты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах. Общая форма оператора import такова:
import пакет1 [.пакет2].(имякласса|*);
Здесь пакет1 — имя пакета верхнего уровня, пакет2 — это необязательное имя пакета, вложенного в первый пакет и отделенного точкой. После указания пути в иерархии пакетов указывается либо имя класса, либо метасимвол «звездочка». Звездочка означает, что, если Java-транслятору потребуется какой-либо класс, для которого пакет не указан явно, он должен просмотреть все содержимое пакета со звездочкой вместо имени класса.
В языке Java имеется три уровня доступа, определяемых ключевыми словами: private (закрытый), public (открытый) и protected (защищенный), которые употребляются в различных комбинациях. Содержимое ячеек таблицы определяет доступность переменной с данной комбинацией модификаторов (столбец) из указанного места (строка).
Есть несколько правил, которые помогут вам разобраться. Элемент, объявленный public, доступен из любого места. Все, что объявлено private, доступно только внутри класса и нигде больше. Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета.
3)
№ 13.
1)
С логическими операторами все просто. Существует только два логических литерала:
boolean yes = true; // истина
boolean no = false; // ложь
Логические литералы можно присваивать только переменным типа boolean. Также важно понимать, что false не равен 0, а true не равен 1. Преобразовать переменную типа boolean в другие примитивные типы не выйдет.
Операции
Над логическим типом
· операторы равенства (== и !=)
· логические операторы (!, &, |, ^)
· условные логические операторы (&&, ||)
· условный оператор (?:)
2)
Интерфейс — это явно указанная спецификация набора методов, которые должны быть представлены в классе, который реализует эту спецификацию. Реализация же этих методов в интерфейсе отсутствует. Подобно абстрактным классам интерфейсы обладают замечательным дополнительным свойством — их можно многократно наследовать. Конкретный класс может быть наследником лишь одного суперкласса, но зато в нем может быть реализовано неограниченное число интерфейсов
Оператор implements — это дополнение к определению класса, реализующего некоторый интерфейс(ы).
class имя_класса [extends суперкласс]
[implements интерфейс0 [, интерфейс1...]] { тело класса }
Если в классе реализуется несколько интерфейсов, то их имена разделяются запятыми.
3)
№ 14.
1)
Когда мы производим какие-то действия с переменными, то нужно следить за типами. Нельзя умножать котов на футбольные мячи, это противоречит здравому смыслу. Также и с переменными. Если вы присваиваете переменной одного типа значение другого типа, то вспоминайте теорию. Например, вы без проблем можете присвоить значение типа int переменной типа long, так как все числа из диапазона типа int гарантировано помещаются в диапазон чисел long. В этом случае Java выполнит преобразование автоматически, вы даже ничего не заметите.
Представим обратную картину - мы хотим присвоить переменной типа byte значение типа double. Java не сможет автоматически выполнить ваше желание. Не все числа типа double могут стать числом типа byte. Но часть чисел может, например, число 9. В таком случае используется так называемое приведение типов, чтобы подсказать Java о допустимости операции.
Итак, автоматическое преобразование типов осуществляется, если оба типа совместимы и длина целевого типа больше длины исходного типа. В этом случае происходит преобразование с расширением. Вы всегда можете преобразовать любое число типа byte в число типа int. Такая операция произойдёт без вашего участия автоматически.
Таблица выглядит следующим образом.
Сплошные линии обозначают преобразования, выполняемые без потери данных. Штриховые линии говорят о том, что при преобразовании может произойти потеря точности. Типы целых чисел и чисел с плавающей точкой совместимы частично. Например, число 5 вполне может быть числом с плавающей точкой (5.0).
Совсем не совместимы, например, char и boolean.
Пора обобщить и запомнить несколько правил:
Типы всех значений byte, short, char повышаются до типа int, как это было рассмотрено выше.
Если один операнд имеет тип long, то тип всего выражения повышается до long.
Если один операнд имеет тип float, то тип всего выражения повышается до float.
Если один операнд имеет тип double, то тип всего выражения повышается до double.
2)
Исключениями или исключительными ситуациями (состояниями) называются ошибки, возникшие в программе во время её работы. Все исключения в Java являются объектами. Поэтому они могут порождаться не только автоматически при возникновении исключительной ситуации, но и создаваться самим разработчиком.
В Java все исключения делятся на три типа: контролируемые исключения (checked) и неконтролируемые исключения (unchecked), к которым относятся ошибки (Errors) и исключения времени выполнения (RuntimeExceptions, потомок класса Exception).
Контролируемые исключения представляют собой ошибки, которые можно и нужно обрабатывать в программе, к этому типу относятся все потомки класса Exception (но не RuntimeException).
Обработка исключения может быть произведена с помощью операторов try…catch, либо передана внешней части программы. Например, метод может передавать возникшие в нём исключения выше по иерархии вызовов, сам его не обрабатывая.
Неконтролируемые исключения не требуют обязательной обработки, однако, при желании, можно обрабатывать исключения класса RuntimeException.
Для защиты программного кода от исключений необходимо использовать связанные блоки с ключевыми словами try catch; catch помещается сразу же после try-блока. В блоке catch задается тип исключения, которое необходимо обработать. Целью большинства хорошо сконструированных catch-разделов должна быть обработка возникшей исключительной ситуации и приведение переменных программы в некоторое разумное состояние - такое, чтобы программу можно было продолжить так, будто никакой ошибки и не было
Программа может явно вызывать исключение, используя оператор throw. После выполнения оператора throw процесс выполнения программы приостанавливается и последующие операторы не выполняются. JVM просматривает ближайший блоки try... catch, соответствующий типу исключения, для "передачи управления". Если подходящий блок не будет найден, то обработчик исключений остановит программу и "распечатает" при этом состояние стека вызовов.
В случае, когда необходимо гарантировано выполнить определенный участок кода необходимо использовать ключевое слово finally. Использование связи try...finally позволяет обеспечить выполнение кода независимо от того, какие исключения были возбуждены и перехвачены, даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch.
У каждого раздела try должен быть по крайней мере или один раздел catch или блок finally. Блок finally очень удобен для закрытия файлов и освобождения любых других ресурсов, захваченных для временного использования в начале выполнения метода.
3) public class Ab {
double a;
double b;
Ab() {
}
Ab(double a, double b) {
this. a = a;
this. b = b;
}
boolean isSquare() {
return a == b? true: false;
}
double getPerimeter() {
return 2 * a + b * 2;
}
double getArea() {
return a * b;
}
public static void main(String [] args) {
Ab p = new Ab(3, 4);
if (p.isSquare()) {
System. out.print("Kvadrat \n ");
} else {
System. out.print("Ne kvadrat \n ");
}
System. out.println("P = " + p.getPerimeter());
System. out.println("S = " + p.getArea());
}
}
№ 15.
1)
Массив (англ. Array) это объект, хранящий в себе фиксированное количество значений одного типа. Другими словами, массив — это нумерованный набор переменных. Переменная в массиве называется элементом массива, а ее позиция в массиве задается индексом. Например, нам нужно хранить 50 различных имен, согласитесь, неудобно для каждого имени создавать отдельную переменную, поэтому мы будем использовать массив. Нумерация элементов массива начинается с 0, а длинна массива устанавливается в момент его создания и фиксируется.
При создании массива в Java первым делом его нужно объявить. Это можно сделать следующим образом:
int[] myFirstArray;
Тип массива задается следующим образом type[], где type это тип данных содержащихся в нем элементов. Скобки являются специальным обозначением того, что переменные содержатся в массиве. Имя массива может быль любым, однако, оно должно соответствовать правилам именования переменных.
Массивы можно создавать не только из переменных базовых типов, но и из произвольных объектов.
При объявлении массива в языке Java не указывается его размер и не резервируется память для него. Происходит лишь создание ссылки на массив.
Размер массива не всегда очевиден, поэтому для того, чтобы его узнать следует использовать свойство length, которое возвращает длину массива.
myColor.length;
Данный код поможет нам узнать, что длина массива myColor равна 3.
2)
Библиотека классов языка включает в себя набор вспомогательных классов, широко используемых в других встроенных пакетах Java. Эти классы расположены в пакетах java.lang и java.util. Они используются для работы с наборов объектов, взаимодействия с системными функциями низкого уровня, для работы с математическими функциями, генерации случайных чисел и манипуляций с датами и временем.
Как вы уже знаете, Java использует встроенные примитивные типы данных, например, int и char ради обеспечения высокой производительности. Эти типы данных не принадлежат к классовой иерархии Java. Они передаются методам по значению, передать их по ссылке невозможно. По этой причине для каждого примитивного типа в Java реализован специальный класс.
Абстрактный класс Number представляет собой интерфейс для работы со всеми стандартными скалярными типами: — long, int, float и double.
У этого класса есть методы доступа к содержимому объекта, которые возвращают (возможно округленное) значение объекта в виде значения каждого из примитивных типов:
• doubleValue() возвращает содержимое объекта в виде значения типа double.
• floatValue() возвращает значение типа float.
• intValue() возвращает значение типа int.
• longValue() возвращает значение типа long.
Double и Float
Double и Float — подклассы класса Number. В дополнение к четырем методам доступа, объявленным в суперклассе, эти классы содержат несколько сервисных функций, которые облегчают работу со значениями double и float. У каждого из классов есть конструкторы, позволяющие инициализировать объекты значениями типов double и float, кроме того, для удобства пользователя, эти объекты можно инициализировать и объектом String, содержащим текстовое представление вещественного числа.
Character
Character — простой класс-оболочка типа char. У него есть несколько полезных статических методов, с помощью которых можно выполнять над символом различные проверки и преобразования.
- isLowerCase(char ch) возвращает true, если символ-параметр принадлежит нижнему регистру (имеется в виду не просто диапазон a-z, но и символы нижнего регистра в кодировках, отличных отISO-Latin-1).
- isUpperCase(char ch) делает то же самое в случае символов верхнего регистра.
- isDigit(char ch) и isSpace(char ch) возвращают true для цифр и пробелов, соответственно.
- toLowerCase(char ch) и toupperCase(char ch) выполняют преобразования символов из верхнего в нижний регистр и обратно.
Boolean
Класс Boolean — это очень тонкая оболочка вокруг логических значений, она бывает полезна лишь в тех случаях, когда тип boolean требуется передавать по ссылке, а не по значению.