ООП. Заголовочные файлы, указатели, перегрузка операций и т д. Кроссплатформенность языка
Скачать 60.07 Kb.
|
toString() – метод, который возвращает значение класса Integer в виде объекта класса String Generics – «дженерики» Джериками принято называть параметризованные типы. Такие типы позволяют объявлять классы, интерфейсы и методы, где тип данных, с которыми они работают указывается в виде параметра. Таким образом, используя дженерики, можно создать единую структуру, которая будет автоматически работать с различными типами данных. Классы, интерфейсы и методы, созданные с использованием джериков называют обобщениями. Параметризированные классы public class Mas { private T [ ] arr; // Т – это некий параметр влияющий на поле Mas (T [ ] arr) { this.arr=arr.clone(); } } public class Test { public static void main (String [ ] args) { Mas Mas T – обозначает имя параметра типа. Это имя используется в качестве заполнителя, вместо которого подставляется имя конкретного типа, передаваемого при создании экземпляра класса Параметр типа при объявлении всегда указывается в угловых скобках. Экземпляры параметризированного класса считаются экземплярами разных типов, если они созданы с разными параметрами. Дженереки не работают с примитивными типами. Обобщенный класс может быть объявлен с любым количеством параметров типа, тогда эти параметры перечисляются в угловых скобках через запятую public class TwoTypes { private T objT; private V objV; TwoTypes (T objT, V objV) { this.objT=objT; this.objV=objV; } TgetObjT() { return objT; } VgetObj() { return objV; } void print () { S.o.p (“T.”+ objT.getClassgetName()); S.o.p(“V.” + objv.getClassgetName()); } } class Test { public static void main (String args [ ]) { TvoTypes T=new TwoTypes <> (666, “Generics”); toprint(); } } На параметр типа можно наложить ограничение сверху, т.е указать для параметра типа суперкласс, от которого должны быть унаследованы все аргументы типов при создании экземпляров данного класса Для ограничение типа параметра используется ключевое слово extends Class < Имя класса >< T extends <супер класс>> { … } Тогда при создании экземпляра данного класса , в качестве значения параметра t можно передавать суперкласс либо его наследников Class Mas < T extends Number > { T [ ] arr ; Mas (T [ ]arr ) { This.arr= arr.clone (); } Double sr() { Double s=0,0; } For (T var :arr) S+= val.double Value (); Return s/arr.leght ; } } Class Test { Public static void main (String [ ] args ) { Integer [ ] m1 = n (1,2,3,4,5,6}; Mas S.o.p(m1.sr ()); Double [ ] m 2 = { 1.0,2.2,3.5,4.7,8.0}; Mas < double > md = new Mas <> (m2); S.o.p(md.sr()); String [] m3 = { «1»,»2»,»3»,}; Mas S.o.p(ms.sr ()) }} В качестве ограничения можно указывать не только имя типа класса , но и имя интерфейса , тогда при создании экземпляра такого параметризированного класса в качестве фактического параметра ,можно передавать класс реализующий указанный интерфейс . В качестве ограничителя параметра можно использовать одновременно использовать класс и несколько интерфейсов . При этом имя класса всегда должно идти первым и между именами необходимо указать знак &. Class C Параметризированные методы . Если объявляется параметризированный класс , то его параметр не явно попадает во все его методы и поля , однако можно создать класс не использующий параметров , но при этом объявить в нем 1 или несколько методов , которых используется параметры типов . Class MyClass { Public static < T,V> boolean isIn (T t,V [ ] arr) { For (V elem : arr ) If (t.equals (elem )) Return true ; Return false ; } Public static void main (String [ ] args) { Integer [ ] a = {1,2,3,4,5,6}; If ( is In (2,a)) S.o.p («2 входит в а «); If (! (is In (7,a))) S.o.p («7 не входит в а»); String [ ] b = { «1»,»2»,»3»}; If (Is In («1»,b) s.o.p(«1входит в b «); } } Конструктор может быть параметризирован , даже если класс не является параметризирован ) Class Myclass { Private double value ; Public < T extends Number > MyClass (T arg ) { Value = arg.double Value (); } Void showValue () { S.o.p(Value ); } } Параметризированные интерфейсы Объявляются как параметризированные классы Public interface MyInterface < T> { T myMed (Tt); } Public class Myclass Public T my Met (T t ) { Return t ; } } Class Test { Public static void Main (String [ ] args) { MyInterface < String > p =new MyClass <> (); String s = p.myMet(«Hello»); } } Внутри параметризированного класса , нельзя создавать экземпляры объектов параметризированного типа Class MyClass < T> { T ob ; MyClass (Tob) { Ob = new T(); } } Нельзя создавать массив спецэфических для обобщенного типа ссылок MyClass < integer > [ ] c = new Myclass < Integer > [ 10] ; Нельзя объявлять статические поля параметризированного типа Нельзя объявлять статические методы которые возвращают параметризированный тип Public static T Лекция 14.11.19 Коллекции В библиотеке коллекций Java существует два базовых интерфейса, реализации которых представляют собой весь набор встроенных коллекций языка. Коллекция – это структура данных, с разным способом доступа к данным, также организованная как класс. Collection – это коллекция, содержащая базовый набор для работы с данными. Базовый набор: добавление элемента или удаление элемента, поиск элемента Map – данный интерфейс описывает коллекцию, состоящую из значений “key-value” Каждому ключу соответствует только одно значение и это соответствует однозначному математическому отображению. Также коллекции, основанные на интерфейсе Map, называют словарями Интерфейс Interable Наследники Collection Первый наследник List Set Queue Методы интерфейса Collection size() – возвращает текущий результат коллекции (тип int) boolean is empty – возвращает true, когда коллекция пуста и false в ином случае boolean contains((Object o) - проверяет содержиться ли объект о в этой коллекции boolean add (E e) – добавляет элемент в коллекцию E и возвращает true, если элемент был добавлен. Если элемент нельзя добавить в коллекцию (ограничение на количество элементов), то возвращается false False может возвращаться в том случае, если мы пытаемся добавить уже существующий элемент в коллекцию, основанную На Set’e boolean remove (Object o) если элемент был удален true, а если коллекция не изменилась, то false Iterator Iterator Boolean hasNext() – возвращает true, если не достигнут конец коллекции и false, когда достигнут конец коллекции E next() – возвращает элемент, из которого состоит коллекция и перемещает итератор на следующий элемент коллекции. void remove() – позволяет удалить элемент, на котором стоит указатель Пример использования итератора: Class Test { Public static void main (String[] args) { ArrayList for( int i=0; i<10; i++) a.add(i); Interator While(it.hasNext()) { System.out.println(it.next()); } } } Iterator iterator имеет ограниченный функционал, более широким функционалом обладает итератор, который называется ListIterator, который можно использовать с теми классами, которые реализует интерфейс List Дополнительные методы, которые появляются в ListIterator следующие: boolean hasPrevias() - возвращает true если в коллекции имеетcя предыидущий элемент и false если предыдущего элемента нет E previous()- возвращает текущий элемент и перемещает итератор на предыдущий элмент коллекции int nextIndex() int previousIndex() Эти методы позволяют получить номер текущего или предыдущего элемента. void set(E object) – позволяет изменить текущий элемент void add(E object)- позволяет добавить элемент после текущего элемента List ArrayList LinkedList ArrayList построен на основе массива, длина которого автоматически увеличивается при добавлении новых элементов, за счёт использования массива время доступа к элементу по индексу минимально. При удалении элемента из ArrayLis’a все элементы, находящиеся правее смещаются на одну позицию влево, но реальная размерность массива при этом не меняется LinkedList В целом по памяти по скорости ArrayList предпочтительнее Помимо всех методов интерфейса Collection, List – содержит собственные методы для работы с упорядоченными данными. Методы get(int t) – возвращает элемент коллекции по индексу void add (int t, E object) – можем добавить элемент object в коллекцию на позицию i void remove (int t) – удаляет элемент по индексу I E set( int t, E object)- заменяет элемент на указанную позицию и возвращает замененный элемент int index (Object o) – возвращает индекс заданного элемента на и i-1, если такого элемента нет ListIterator List Пример: LinkedList list.add(“abc”); list.add(“123”); list.add(“***”); ListIterator while( it.hasNext()) S.o.p(it.next()); it= =listIterator(list.size()); while(it.hasPrevious()) S.o.p(it.previous)); Лекция 21.11.2019 Интерфейс set set – это коллекция, которая не может содержать повторяющихся элементов. Интерфейс set содержит только методы, унаследованные от интерфейса Collection и добавляет в эти методы ограничения, чтобы эти элементы не дублировались. set накладывает более строгие ограничения на метод equals, и это позволяет сравнивать экземпляры set даже если они относятся к разным реализациям set’a. Экземпляры set считаются равными, если они содержат одинаковое количество элементов и сами элементы, одинаковы Реализация интерфейса Set HashSet LinkedHashSet TreeSet С помощью set можно удалить дублирующеися элементы из любой коллекции. Например, если есть произвольная коллекция C, то можно вот таким способом получить коллекцию C1, в которой не будет повторяющихся элементов. Collection Интерфейс очередь Методы интерфейса Queue (очередь) В этом интерфейсе существует по две версии каждого метода. Одна версия выбрасывает исключения, если операцию выполнить невозможно, а другая версия возвращает в этом случае специальное значение Исключение: Специальное значение: add(E elem) добавляют элемент offer(E elem) revome () удаляют элемент из очереди и возвращают удаленный элемент сначала poll () element() возвращают головной элемент очерди, не удаляя это значение из очереди peek() Класс, который реализует интерфейс Queue называется PriorityQueue Пример: PriorityQueue q Random r = new Random(); for(int i=0; i<10; i++) q.add (r.nextInt(50)+1); while (!q.isEmpty()) { System.Out.println(q.poll()); } Интерфейс Deque (дек) Deque – это реализация очереди с двумя концами, т.е. это линейная коллекция элементов с возможностью добавления и удаления с обеих сторон. Стандартная реализация интерфейса Deque это класс ArrayDeque, у которого реализованы следующие методы: Исключения: AddFirst(E elem) добавление первого и последнего соответственно AddLast(e elem) removeFirst(); removeLast; getFirst(); getLast(); Специальное значение: 1)offerFirst(E elem) 2) offerLast(E elem) 3) pollFirst(); 4) pollLast(); 5) peekFirst(); 6) peekLast() Интерфейс Map interface Map K задает тип ключа, а V – задает тип хранимого значения С помощью Map’a можно хранить пары значений keyVallue, где ключ используется для извлечения элементов. Значение ключа не может дублироваться в пределах одной коллекции Map Методы интерфейса Map size() – возвращает размер текущего словаря isEmpty() – проверяет на пустоту containsKey(Object o) – входит ли ключ в заданную карту containsValue(Object o) – входит ли значение в заданную карту get(K key) – возвращает значение по ключу в виде элемента типа V put(K, key, V value) - добавить элемент в коллекцию remove(K key)- удаляет значение по ключу и возвращает удаленное значение Основные реализации Map’a HashMap – реализован на основе Hash – таблиц. За счёт реалзации интерфейса Map позволяет хранить пары Ключ-Значение. Самый быстрый доступ. LinkedMap – расширяет класс HashMap позволяя создавать связанный список элементов в карте. Это позволяет организовать перебор элементов в том порядке, в котором они вставлялись TreeMap – реализация интерфейса Map, где для хранения элементов применяется дерево Лекция 05.12.19 Создание оконных приложений В Java для создания оконных приложений существует две библиотеки: библиотека AWT и библиотека Swing В библиотеке AWT содержаться средства для создания платформо-ориентированных приложений, а в библиотеке Swing содержаться средства для создания платформо-независимых оконных приложений. Окно верхнего уровня в Java принято называть фреймом, для фрейма в библиотеке AWT есть класс Frame, в библиотеке Swing есть класс JFrame. Класс JFrame расширяет класс Frame. Обычно Frame в Java служит контейнером для других компонент. Для того чтобы создать Frame, содержащий компоненты библиотеки Swing, необходимо определить класс, расширяющий класс JFrame. JFrame содержится в пакете javax.swing Основные методы класса JFrame, которые позволяют изменять внешний вид окна setTitle(String s) – позволяет установить строку s в качестве заголовка окна setIconImage(Image image) – берет объект класса Image и устанавливает его в качестве иконки setResizable(boolean b) – задает возможность изменения размеров окна dispose() – закрывает окно и освобождает все ресурсы, используемые этим окном Большинство методов для модификации окна содержаться в классе Component библиотеки AWT Основные методы класса Component setSize(int W, int h) – позволяет установить размеры component'a, в частности Fram’a. По умолчанию Frame имеет размеры о на 0, поэтому setSize является обязательным методом, который участвует в создании Fram’a setVisible(boolean b) – позволяет установить видимость для component’a. По умолчанию Frame считается не видимым, т.е false setEnabled(boolean b) – позволяет разрешит либо запретить доступ к component’у. Доступен по умолчанию isEnabled() – проверяет доступность component’a isShowing() – позволяет узнать, можно ли отобразить component Dimension gerSize() – возвращает размер окна в виде класса setBounds(int x, int y, int w, int h) – одновременно переносит component и устанавливает его размер Пример создания Fram’a: class MyFrame extends JFrame { final int WIDTH=800; final int HEIGHT=600; MyFrame() { setSize(WIDTH, HEIGHT); setTitle(“My first frame”); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class Test { public static void main (String [ ] args) { MyFrame frame = new MyFrame(); } } Создался пустой frame с заголовком. Для добавления некого component’a на Frame предназначен метод |