ООП. Заголовочные файлы, указатели, перегрузка операций и т д. Кроссплатформенность языка
Скачать 60.07 Kb.
|
Абстрактными нельзя делать конструкторы и статические методы. Любой подкласс абстрактного класса должен либо реализовать все абстрактные методы, либо сам быть объявлен абстрактным. Abstract class Figure { Point [ ] p; Abstract double p ( ); Abstract double s ( ); Void print ( ) { System.out.printn («Фигура с вершиной»); For (int i=0; i { System.out.printn (p[ i ]. getx( ) + “ “ + p [i].get(0) ); System.out.printn( ); } } } Class Triangle extends Figure { Triangle ( ) { P=new Point [3]; Scanner sc = new Scanner (System.in); For(int i =0; i { Int x=sc.nextIn ( ); Int y=sc.nextIn ( ); Point pt = new Point (x, y); P [i] =pt; } } Doible p ( ) { Return p[0].dist (p[i])+p[i].dist(p[i])+p[2].dist(p[3]) } Double s ( ) { Double a = p[0].dist (p[1]); Double b = p[1].dist (p[2]); Double c = p[2].dist (p[0]); Double p2 = (a+b+c)/2; Return Math.sqrt(p2*(p2-a)*(p2-b)*((p2-c)); } } Интерфейсы. Интерфейс представляет собой набор требований, предъявляемых к некоторому классу, однако сами классом не являются. Интерфейс предназначен для реализации динамического выбора методов во время выполнения программы. В интерфейсах объявляются только заголовки методов, а реализация их отсутствует. Для интерфейсов нельзя создавать конкретных представителей. Для того чтобы методы, объявленные в интерфейсе, были реализованы, класс должен реализовать этот интерфейс. При этом заголовки методов в интерфейсе и в классе должны совпадать. Класс может реализовать любое количество интерфейсов. Структура интерфейса следующая: Interface <Имя> { <тип> <имя метода 1> (<список параметров>); ………………………………………………………………… <тип> <имя метода n> (<список параметров>); <тип> <имя переменной> =<значение>; …………………………………………………………… <тип> <имя переменной n> =<значение>; } Помимо заголовков методов в интерфейсе можно объявлять переменные, при этом они считаются не явно объявленными как final, соответственно класс, реализующий интерфейс не может изменять значение этих переменных. Обязательно присваивать конкретные значения всем переменным, объявленным интерфейсе. Методы интерфейса считаются не явно объявленными как public Для реализации класса интерфейса используется ключевое слово implements: Class<Имя класса> [extends <Имя суперкласса>] Implements <Имя интерфейса> { …. … … } Если класс реализует несколько интерфейсов, то их имена должны быть перечислены после implements, через запятую. Если в этом случае в нескольких интерфейсах есть методы с одинаковыми заголовками, то для них будет использоваться общая реализация: Interface Figure { Double p ( ); Double s ( ); } …………………. Class Reet implements Figure { Double a, b; Reet (double a, double b) { This.a=a; this.b=b; } Public double p ( ); { Return 2*(a+b); } Public double s ( ) { Return a*b; } } Class Triangle implements Figure { Double a, b, c; Triangle (double a, double b, double c) { This.a=a; this.b=b; this.c=c; } Public double p ( ) { Return a+b+c; } Public double s ( ) { Return Math.sqrt(p( ) /2 *(p( ) / 2-a)*(p( )/2-b) * (p( ) / 2-c) } } Для реализации динамического выбора методов можно объявлять переменные интерфейсного типа и при этом инициализировать их экземплярами любого класса, который реализует интерфейс Class Test { Public static void main (String [args]) { Figure f; F= new Rect (5,8) System.out.printn(“p= “ + f.p( ) + “s= “ + f.s( )) F=new Triangle (5,3,6); System.out.printn(“p= “ + f.p( ) + “s= “ + f.s( )) } Интерфейсы можно использовать для импорта совместно используемых констант в различные классы. В таком случае в интерфейсе объявляются только переменные, которые лучше явно объявить final-переменными и затем данный интерфейс реализуется в тех классах, где необходимы эти константы. Если в интерфейсе нет методов, то его реализация заключается просто в добавлении слова implements с именем интерфейса. Интерфейсы обладают собственной иерархией наследования, которая не связана с классовой, если класс должен реализовать интерфейс, унаследованный от другого интерфейса, то он должен реализовать все методы обоих интерфейсов. Interface A { Void m1( ); Void m2( ); } Interface B extends A { Void mb ( ) } Class C implements B { Public void m1 ( ) System.out.println(«Метод 1»); } Public void m2 ( ) { System.out.println(«Метод 2»); } Public void m3 ( ) { System.out.println(«Метод 3») } } Лекция 10.10.2019 Внутренний класс Внутренним классом является класс, объявленный в другом классе. Если класс объявлен внутри метода, то он называется локальным внутренним классом. Внутренний класс имеет доступ ко всем полям и методам содержащего его класса в том числе к приватным. Внутренний класс невозможно создать без конкретного объекта его внешнего класса. Снаружи внешнего класса внутренний класс не виден. Внутри внутреннего класса thisпозволяет обращаться к его собственным элементам. <Имя внешнего класса> . this – позволяет обращаться из внутреннего класса к полям и методам внешнего класса. Class Avto { String marka; Int year; Double v; Wheel front, back // это поле является элементом внутренненго класса Avto (String marka, int year, double v} { This.marka=marka; This.year=year; This.v=v; Front =new Wheel (18 , 255, 55); Back = new Wheel (19, 260, 50); } String getMarka () { Return marka; } …………. Class Wheel { Int r, w, h; Wheel (int r,int w, int h) { This.r=r This.w=w; This.h=h; } } } Class Test { Public static void main (String [ ] args) { Avto a =new Avto (…..); Wheel = new Wheel ( ); Исключения. В Java исключение – это объект, который описывает некоторую ошибочную ситуацию, произошедшую в некотором месте кода. Когда возникает ошибочная ситуация генерируется специальный объект, и он выбрасывается в метод, который привел к возникновению ошибки. Далее метод может либо сам обработать это исключение, либо передать его дальше исполняющей системе Java. В любом случае выброшенное исключение всегда будет захвачено и обработано. Исключения могут генерироваться автоматически исполняющей системой Java, либо вручную программистом. Автоматические исключения касаются фундаментальных ошибок языка. Исключения, которые генерирует программист обычно сигнализируют о неких аварийных ситуациях в программе. Операторы, которые могут вызвать возникновение ошибочной ситуации помещаются в try – блок . Блок catch служит для захвата объектов исключений и их обработки. Finally – блок служит для размещения операторов, которые должны выполниться независимо от наступления заключительной ситуации. Для генерации исключений вручную служит ключевое слово throw и метод который может выбросить исключение обязан оповестить другие методы об этом с помощью ключевого слова throws. Общая схема обработки исключений try { // операторы, требующие контроля } catch (Exception Type1 ob1) { // обработка исключений типа Exception Type } catch (Exception Type1 ob2) { // обработка исключений типа Exception Type } finally { // операторы, которые выполняются всегда Throwable Error – сами гененерируются обрабатваются (туда не лезем) Exception Runtime Exception A’) Array Index Out of Bounde Exception B’) Arithmetic Exception Class Test { Public static void main (String [ ] args) { Int d=0; System.out.println(42/d); } } Поскольку метод main сам не обрабатывает исключения, оно будет передано исполняющей системе. Работа метода приостанавливается, пока исключение не будет обработано, а обработка исполняющей системы заключается в печати трассы стека и аварийном завершении программы Java.lang.Arithmetic Exception/ : byzero at main (Exe.main; 4) Теперь исправляем эту ошибку Class Test { Public static void main (String [ ] args) { Try { Int d=0; Int a = 42; System.out.println(a/d); System.out.println(«Это не будет напечатано»); } Catch (Arithmetic Exception e) { System.out.println(«Ошибка деления на ноль»); } } Class Test { Public static void main (String [ ] args) [ Random r = new Random (); Int a, b, c; For(int i=0; i<32000; i++) { Try { B=r.nextInt( ); C=r/nextInt ( ) ; A= 12345 / (b/c); } Catch ( Arithmetic Exception e) { A=0; } System.out.println(“a= “ +a); } } } Бывают ситуации, когда один участок кода может генерировать несколько исключений разного типа, в таком случае после блока try необходимо разместить несколько блоков catch, каждый для обработки своего типа исключения Class Test { Public static void main (String [ ] args) [ Random r = new Random (); Int a, b=5 ; Int [ ] c = new int [2]; A=r.nextInt (); Int d = b/a; C [42] =d; } Catch ( Arithmetic Exception e) { s.o.p (“Ошибка /0”); } Catch (Array Index Out Bounds Exception e ) { s.o.p («Выход за границу индекса») } } } Лекция 24.10.19 Во всех рассмотренных ранее примерах исключения генерировались автоматически исполняющей системой. Для ручной генерации исключений необходимо использовать оператор throw, дойдя до которого, выполнение программы приостанавливается, генерируется объект исключения и выбрасывается в метод, где располагается оператор throw. После этого просматривается ближайшее включение try catch блока, если оно соответствует типу выброшенного исключения, то оно захватывается и обрабатывается этим блоком. Если же соответствие не найдено, то ищется следующее включение try catch и т.д .Если же подходящий по типу блок не будет найден, то исключение будет обработано обработчиком по умолчанию. Если метод, в котором выбрасывается исключение, сам его не обрабатывает, то он должен оповестить другие методы об этом, чтобы они могли обезопасить себя от этого исключения. Это делается в заголовке метода, с помощью ключевого слова thorws <тип> <имя метода> (<список параметров>) throws <список исключений> { Тело метода } В список throws необходимо размещать все типы исключений, которые может выбрасывать данный метод, кроме исключений класса RuntimeException и его подклассов. Все встроенные классы исключений имеют два конструктора: один – без параметров, а другой с параметром строчного типа, который описывает исключительную ситуацию. Далее это описание может быть получено с помощью метода getMessage( ), который объявлен в классе Throwalle Пример: try Scanner sc=new Scanner (System.in); int x =sc.nextInt(); if(x>=30) throw new Exception (“Число не должно превышать 30”); } catch(Exception e) { System.out.println(e.getMessage()); } static int getFact(int n) throws Exception { If(n<1) throw new Exception (“Число должно быть >0”) int res=1; for(int i=1; i<=n; i++) res*=i; return res; } public static void main (String [ ] args) { try { System.out.println(getFact(-6)); } catch (Exception e) { s.o.p(e.getMessage()); } } В Java имеется возможность создавать классы исключений, они должны быть наследниками класса Exception Class FactException extends Exception { String name; int n; FactException (String name, int n) { super(name); this.n=n; } int getN( ) { return n; } static int getFact(int n) throws FactException // теперь здесь два параметра { If(n<1) throw new FactException (“Число должно быть >0”, n) int res=1; for(int i=1; i<=n; i++) res*=i; return res; } public static void main (String [ ] args) { Try S.o.p (getFact(-6)) } catch (FactException e) { s.o.p(e.getMessage()); s.o.p(e.getN()); } } Класс Object Класс Object является не явным суперклассом для всех классов, описанных в Java – программы toString( ) – возвращает описание объектов в виде строки hashCode( ) – присваивает объекту некое уникальное числовое значение, которое позволяет идентифицировать этот объект getClass ( ) – возвращает имя класса, для того объекта, на который вызывается equals ( ) – сравнивает равенство по ссылкам. Class Person { String name Person (String name) { this.name=name; } public boolean equale (Object obj) { If (!(obj instance of Person)) return false; Person p=(Person) obj; return p.getName( ). equals(name); } String getName( ) Лекция 31.10.19 Классы оболочки При использовании встроенных классов коллекции их нельзя создавать на основе примитивных типов. Для этих целей служат классы оболочки, которые позволяют разместить значение примитивного типа внутри объекта. Все классы оболочки наследуются от абстрактного класса Number Для каждого примитивного числового типа у нас есть класс оболочка: Long Double Integer Float Short Byte Существует два способа для создания экземпляров классов оболочек: Через вызов конструктора: Integer i1=new Integer (100); «Автоупаковка» Integer i2=100; i2=i2+5; // - это «автораспаковка» Все классы оболочки являются наследниками класса Number, т.е они не явный extendsэтого класса. Все они реализуют интерфейс Comparable . Реализация данного интерфейса говорит о том, что элементы этого интерфейса являются сравнимыми Основные методы класса Integer equals() – метод, который позволяет сравнивать на равенство два объекта класса integer, это не статический метод. parseInt () – метод, приводит к типу Integer . Вызывается вот так: Integer parse Int (“1,2,3”) При ошибочных действия в строке, например, строка содержит недопустимые символы или число больше своего диапазона выводится исключение: NumberFormatException max() – метод, который позволяет вернуть наибольший из двух значений Integer.max(int x, int y) min() – метод который позволяет вернуть наименьший из двух значений Integer.min(int x, int y) Compare() – метод, который возвращает результат сравнения двух значений Integer.compare(int x, int y) GetInteger() – метод, который возвращает строку в виде объекта класса Integer Integer.get.Integer (String = ) doubleValue() – метод, который приводит к примитивному типу double doubleValue() revers() – статический метод, который возвращает число, типа int полученное в результате перестановки битов исходного числа в обратном порядке Integer.reverse(int x) |