Пацей 4 сем / Лекции / СТПI_2_ООП
.pdfМодификатор native
сообщает компилятору, что метод реализован в другом месте (с++)
public native int loadFreeDiskSpace();
можнопереопределять обычными методами в подклассах
Модификатор synchronized
включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении
Логические блоки
►вызываются последовательно, в порядке размещения, вместе с инициализацией полей как простая последовательность операторов, до вызова
конструктора класса
public class Bill { |
|
|
|
|
{System.out.println("Первый логический блок"); |
} |
|||
static { System.out.println("Статический блок"); } |
||||
private int id; // переменная экземпляра класса |
|
|||
public Bill() { // |
|
|
|
|
super(); |
|
|
|
|
System.out.println("Конструктор");} |
|
|
||
{ System.out.println("Второй логический блок"); |
|
|||
this.id =45; |
} |
Статический блок |
||
Первый логический блок |
||||
} |
|
class Demo{ |
Второй логический блок |
|
|
||
public static void main(String[] args) {Конструктор |
||
Bill theBest = new Bill(); |
Первый логический блок |
|
Второй логический блок |
||
Bill theNextOne = new Bill(); |
||
Конструктор |
||
} |
||
|
||
} |
|
Параметризованные классы
|
(generic) |
классов запрещено |
|
|
|
|
В качестве параметров |
|
|
public class Message<T1, T2 extends Number> { |
применять базовые типы. |
|
||
private T1 info; |
|
|
|
|
ограничения на используемые типы |
||||
private T2 id; |
}
class Runner{
public static void main(String[] args) {
Message<String,String> one = new Message<String, String>();
//ошибка не Number
Message<StringBuffer, int> two = new Message<StringBuffer, int>();
//ошибка не м.б. примитивным
Message<Integer,Double> three = new Message<Integer, Double>();
//ok
Message<Integer, Integer> six = new Message<Integer, Integer>();
//ok
Message<String,Integer> five = new Message<>();//diamond оператор
three=six;// ошибка Message seven = new seven = six;//ok
}
не верные типы
Message();// параметризация по умол. Object
При компиляции вся информация о generic-типах стирается и заменяется для членов класса и методов заданными типами или типом Object, если параметр не задан
Метасимвол ?
Сравнение объектов с разными типами
параметров |
|
Чтобы метод мог |
|
|
|
распространить свои |
|
public class Message<T1, T2 extends Number> { |
возможности на |
||
экземпляры класса, |
|||
private T1 |
info; |
||
инициализированные |
|||
private T2 |
id; |
||
любым допустимым |
|||
|
|
||
|
|
типом |
|
public Message(T1 |
a, T2 b) {info=a; id =b;} |
|
public boolean equalsMessage(Message<T1,?> other){ return Math.round(this.id.floatValue()/10 )
== Math.round(other.id.floatValue());
}
} class Runner{
public static void main(String[] args) { Message<Character,Integer> american = new Message<>('a',50); Message<Character, Float> russian = new Message<>('r',5.15f);
System.out.println(american.equalsMessage(russian));
Generic-ограничения
1)невозможно выполнить явный вызов конструктора generic-типа
public class Message<T1, T2 extends Number> { private T1 info = new T1(); // ошибка
2)generic-поля не могут быть статическими
public class Message<T1, T2 extends Number> {
static private T1 info ;
3) статические методы не могут иметь generic-параметры или обращаться к
generic полям
Параметризованные методы
<T extends Тип> returnType methodName(T arg) { } <T> T[ ] methodName(int count, T arg) { }
►Могут быть в любых классах (парам и непарам)
►Могут иметь метасимвол
class SimpleAct {
public <T1 > SimpleAct(T1 operand) { // конструктор
// реализация
}
public <T4> boolean printRezult() { return true;
}} |
multi.<Integer>print(); |
...
SimpleAct multi = new SimpleAct(new Message<String,Integer>("Gost",1974));
multi.<Integer>printRezult();
Методы с переменным числом параметров
public static int defineArgCount(Integer... args) { args.length;
for (int element : args) {
}
}
1) должен быть единственным (переменн) и последним
2) могут быть перегружены, переопределены
Лямбда - выражения
Блок кода с параметрами, который можно передать
вдругое место
►Java 8 функциональная конструкция
►Назначение
лаконичность кода
скорость написания
могут быть преобразованы в функциональные
интерфейсы
доступ к final переменным из охватывающей области
видимости
ссылки на метод и конструктор без их вызова
разрешают конфликты между методами по умолчанию из нескольких интерфейсов
class LengthStringComparator implements Comparator<String> { public int compare(String firstStr, String secondStr)
{
return
Integer.compare(firstStr.length(),secondStr.length());
}
}
void function (){
String[] s = new String [] {"asyuuy", "dfg", "hjkl"}; Arrays.sort(s, new LengthStringComparator ());
for (String i: s ) {
Log.i("info",i);
}
}