1 / 88

Основы программирования на языке Java

Основы программирования на языке Java. Средства ООП Java. Ключевые слова – статус. Ключевые слова, которые уже известны на текущий момент:

dung
Télécharger la présentation

Основы программирования на языке Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Основы программирования на языке Java Средства ООП Java (С) Всеволод Рылов, все права защищены

  2. Ключевые слова – статус Ключевые слова, которые уже известны на текущий момент: abstract defaultif privatethisbooleando implements protectedthrow breakdouble import public throws byteelse instanceof return transient case extendsintshorttry catch final interfacestaticvoidcharfinally long strictfp volatile classfloat native super while const fornewswitchcontinue goto package synchronized (С) Всеволод Рылов, все права защищены

  3. Виды переменных • переменные классов (class variable - переменная-член объявленная static ) • переменные экземпляра (instance variable – переменная-член класса объявленная без static) • компоненты массивов: int ia[] = new int[3]; ia[0] • параметры методов: void doSome(int i, Object o) {…} • параметры конструкторов: MyClass(Object param) {…} • параметры перехватчиков исключений: catch(Exception ex) {…} • локальные переменные, объявленные внутри методов, блоков, и в операторе for (С) Всеволод Рылов, все права защищены

  4. Модификатор final • Переменная объявленная final может быть проинициализирована ровно один раз, после этого ее значение изменить нельзя. • Если ссылка объявлена с модификатором final, то это не значит, что нельзя изменить состояние объекта на который она ссылается! Нельзя изменить лишь саму переменную ссылочного типа. void unflow(boolean flag) { final int k; if (flag) { k = 3; System.out.println(k); } if (!flag) { k = 4; System.out.println(k); } } //compile-time error! void unflow(boolean flag) { final int k; if (flag) { k = 3; System.out.println(k); } else { k = 4; System.out.println(k); } } // all ok (С) Всеволод Рылов, все права защищены

  5. Объекты и значения ссылочного типа Объекты - экземпляры классов (class instance)и массивы. ClassInstanceCreationExpression: new ClassOrInterfaceType ( ArgumentListopt ) ClassBodyopt Primary.new Identifier ( ArgumentListopt ) ClassBodyopt ArgumentList: Expression ArgumentList , Expression //Создание объектов – экземпляров классов class MyClass implements MyInterface {…} MyClass myObj = new MyClass(); MyInterface anotherObj = new MyClass(“parameter”); MyClass reflObj = (MyClass)Class.forName(“MyClass”).newInstance(); (С) Всеволод Рылов, все права защищены

  6. Операции над ссылками • доступ к полю: obj.x = 10; super.y = 20; • вызов метода: obj.doSome(); super.doAnother(); • преобразование типа: (Object)obj • строковый оператор + : String s = “one” + obj; //вызывается метод obj.toString(); • оператор проверки типа instanceof: if (obj instanceof MyClass) {…} //Проверяется тип obj • операторы сравнения ссылок == и !=: if (obj == obj2 && obj != obj3) {…} • условный тернарный оператор ? : obj = ( obj2.size() < obj3.size() ) ? obj2: obj3; (С) Всеволод Рылов, все права защищены

  7. Объекты – массивы: грамматика ArrayCreationExpression: new PrimitiveType DimExprs Dimsopt new TypeName DimExprs Dimsopt new PrimitiveType Dims ArrayInitializer new TypeName Dims ArrayInitializer DimExprs: DimExpr DimExprs DimExpr DimExpr: [ Expression ] Dims: [ ] Dims [ ] (С) Всеволод Рылов, все права защищены

  8. Создание и инициализация массивов // Создание массивов примеры: // Создание объекта – массива из трех ссылок на объекты типа MyClass MyClass array[] = new MyClass[3]; // Инициализация элемента массива (ссылки): array[0] = new MyClass(); // Создание объекта – массива из двух ссылок на объекты-массивы //ссылок на объекты класса MyClass MyClass array2[][] = new MyClass[2][]; // Инициализация элементов 0 и 1 массива array2 array2[0] = new MyClass[5]; //объект – массив из 5 ссылок array2[1] = new MyClass[4];//объект – массив из 4 ссылок // Объект - массив из трех элементов типа int int array3[] = new int[3]; array3[0] = 0; // Создание и инициализация массива из четырех элементов int int array4 [] = new int [] {1,2,3,4}; // Создание и инициализация объекта-массива ссылок на объекты //класса MyClass MyClass array5[] = {new MyClass(“a”), new MyClass(“b”)}; (С) Всеволод Рылов, все права защищены

  9. Особенности использования массивов Члены объектов-массивов: • public final int lengthэто поле содержит длину массива • public Object clone()– создает копию массива • + все методы класса Object. Любой массив можно привести к классу Object или к массиву совместимого типа. class Test { public static void main(String[] args) throws Throwable { int ia[][] = { { 1 , 2}, null }; int ja[][] = (int[][])ia.clone(); System.out.print((ia == ja) + " "); System.out.println(ia[0] == ja[0] && ia[1] == ja[1]); } } // this program prints: false true (С) Всеволод Рылов, все права защищены

  10. Особенности использования массивов class Point { int x, y; } class ColoredPoint extends Point { int color; } class Test { public static void main(String[] args) { ColoredPoint[] cpa = new ColoredPoint[10]; Point[] pa = cpa; System.out.println(pa[1] == null); try { pa[0] = new Point(); } catch (ArrayStoreException e) { System.out.println(e); } } } (С) Всеволод Рылов, все права защищены

  11. Классы • Классы объявляют новый ссылочный тип и определяют его реализацию • Вложенный (nested) класс – это класс объявленный внутри другого класса или интерфейса (в том числе класс объявленный внутри метода или блока): • member class – объявленный внутри класса • local class – объявленный внутри метода • anonymous class – не имеющий имени • Верхнеуровневый (top-level)класс – это класс, не являющийся вложенным • Именованные (named)классы могут быть абстрактными (С) Всеволод Рылов, все права защищены

  12. Классы • Каждый класс кроме Object является наследником другого класса и может реализовывать (implements) произвольное количество интерфейсов • Тело класса может содержать: • члены (members): • поля • методы • вложенные классы и интерфейсы • инициализаторы экземпляра • статические инициализаторы • конструкторы • Видимость членов и конструкторов регулируется модификаторами доступа public, private, protected (С) Всеволод Рылов, все права защищены

  13. Классы и наследование • Членами класса являются унаследованные и определенные в классе члены • Вновь объявленные поля могут скрывать поля суперклассов и суперинтерфейсов • Вновь объявленные методы могут скрывать, реализовывать или перегружать методы, объявленные в суперклассе или суперинтерфейсе • Вложенные классы бывают статическими и внутренними (inner), в зависимости от контекста в котором они объявлены (если в точке объявления имеет смысл ссылка this – то вложенный класс будет внутренним) (С) Всеволод Рылов, все права защищены

  14. Методы • Методы описывают участки кода, которые могут быть вызваны с помощью выражения вызова метода • Метод класса исполняется в контексте переменных класса (static context) • Метод экземпляра исполняется в контексте конкретного объекта, доступного по this • Методы не имеющие реализации должны быть объявлены abstract • Допускается перегрузка методов по списку и типам аргументов • Метод может иметь платформенно-зависимую реализацию (native method) (С) Всеволод Рылов, все права защищены

  15. Статический контекст (С) Всеволод Рылов, все права защищены

  16. Конструкторы и инициализаторы • Инициализаторы экземпляра – блоки кода {…} выполняемые при инициализации объекта. Выполняются перед вызовом конструктора. • Статические инициализаторы – статические блоки кода static {…} выполняемые при первом использовании класса (после его загрузки но перед созданием первого объекта или доступом к полю) • Конструкторы в отличие от методов не могут быть вызваны непосредственно с помощью выражения вызова метода. Конструкторы вызываются при создании экземпляров объектов и могут быть перегружены (С) Всеволод Рылов, все права защищены

  17. Грамматика объявления класса ClassDeclaration: ClassModifiersopt class Identifier Superopt Interfacesopt ClassBody ClassModifiers: ClassModifier ClassModifiers ClassModifier ClassModifier: one of public protected private abstract static final strictfp Super://Определяет «прямой суперкласс» extends ClassType Interfaces://Определяет «прямые суперинтерфейсы» implements InterfaceTypeList InterfaceTypeList: InterfaceType InterfaceTypeList , InterfaceType (С) Всеволод Рылов, все права защищены

  18. Пример объявления класса public abstract class MyClass extends Parent implements MyInterface, AnotherInterface { static { //Static initializer } { //Non static initializer } public MyClass() { super(); //Вызов конструктора супер класса } } (С) Всеволод Рылов, все права защищены

  19. Модификаторы объявления класса • public – класс доступен извне пакета. • abstract – класс является абстрактным (в нем есть абстрактные методы) • final – класс является конечным в иерархии наследования. От него нельзя унаследовать другой класс • strictfp –для всех методов класса действуют правила строгой проверки арифметических выражений во время вычислений Для вложенных(внутренних) классов дополнительно действуют следующие модификаторы: • static – класс является статическим (вложенный класс) • protected –к классу имеют доступ только классы наследники объемлющего класса или классы в том же пакете • private – к классу имеет доступ только объемлющий класс (С) Всеволод Рылов, все права защищены

  20. Строгое определение абстрактного класса Класс Cявляется абстрактным, если: • Cявно содержит объявление абстрактного метода • Какой-либо класс-родитель C содержит объявление абстрактного метода, который не был реализован в классе Cили в его родительских классах • «Прямой суперинтерфейс» Cопределяет или наследует метод, который не реализован (и поэтому является абстрактным) т.е. ни Cни его родительские классы не определяют реализацию этого метода (С) Всеволод Рылов, все права защищены

  21. Внутренние (inner)классы • Внутренний (inner)класс – это класс который ни явно, ни неявно не является static • Внутренний класс не может содержать блоков статической инициализации или членов-интерфейсов • Внутренний класс не может содержать статических членов за исключением полей-констант времени компиляции • Внутренние классы могут наследовать статические члены, не являющиеся константами времени компиляции • Члены-интерфейсы всегда являются staticпо умолчанию • Вложенные классы могут свободно содержать статические члены как и обычные классы Java (С) Всеволод Рылов, все права защищены

  22. Пример вложенности классов class HasStatic{ static int j = 100; } class Outer{ class Inner extends HasStatic{ static final int x = 3; //ok - compile-time constant static int y = 4; //compile-time error, an inner class } static class NestedButNotInner{ static int z = 5; // ok, not an inner class } interface NeverInner{} // interfaces are never inner } (С) Всеволод Рылов, все права защищены

  23. Статический контекст • Выражение находится в статическом контексте, тогда и только тогда, когда наиглубочайший включающий его метод, конструктор, блок инициализации или инициализатор поля является статическим методом, статическим инициализатором или инициализатором статической переменнойсоответсвенно. • Проще говоря, если в точке объявления класса имеет семантику ссылка thisна объект объемлющего класса, то контекст объявления является динамическим (non static)и класс будет внутренним. (С) Всеволод Рылов, все права защищены

  24. Immediately enclosing instance • Внутренний классCявляетсянепосредственным внутренним классом (direct inner class of)классаOеслиOнепосредственно лексически включает класс C, и декларация Cне находится в статическом контексте. КлассCявляется внутренним классом (inner class)класса Oесли это непосредственный внутренний класс класса Oлибо является внутренним классом внутреннего класса O. • КлассOявляется лексически объемлющим классом порядка 0 (zeroth enclosing class of itself) для самого себя. Класс Oявляется лексически объемлющим классом порядка n (nth lexically enclosing class)класса Cесли он является непосредственным объемлющим классом для лексически объемлющего класса порядка n – 1 класса C. • Экземпляр объекта iнепосредственного внутреннего класса Cкласса Oвсегда связанс объектом классаO, известным как непосредственно объемлющий объект для i (the immediately enclosing instance of i). Непосредственно объемлющий объект, если таковой имеется, связывается с объектом при его создании. • Объект oявляется лексически объемлющим объектом порядка 0 (zeroth lexically enclosing instance)самого себя. Объектoявляется лексически объемлющим объектом порядка nдля объекта i, если он является непосредственно объемлющим объектом для лексически объемлющего объекта порядка n – 1 объекта i. (С) Всеволод Рылов, все права защищены

  25. Immediately enclosing instance • Анологично, если суперкласс SклассаCявляется непосредственным внутренним классом классаSO, то существует экземпляр SO, связанный с объектомiкласса C, известный как непосредственно объемлющий экземпляр по отношению к S (the immediately enclosing instance of i with respect to S).Непосредственно объемлющий экземпляр объекта по отношению к его прямому суперклассу, если таковой имеет место быть,определяется в момент вызова конструктора суперкласса посредством вызова конструктора суперкласса по умолчанию. • Когда внутренний класс ссылается на переменную экземпляра являющуюся членом лексически объемлющего класса, используется переменная (поле) соответствующего лексически объемлющего объекта. Неинициализированное final поле объемлющего класса не может быть использовано в контексте внутреннего класса. • Любая локальная переменная, формальный параметр метода, или параметр перехватчика исключения используемые во внутреннем классе, но объявленные в объемлющем, должны быть объявлены со спецификатором final, и должны быть явно проинициализированы до их использования в теле внутреннего класса. (С) Всеволод Рылов, все права защищены

  26. Пример – ограничение доступа class Outer { int i = 100; static void classMethod() { final int l = 200; class LocalInStaticContext{ int k = i; // compile-time error int m = l; // ok } } void foo() { class Local { // a local class int j = i; } } } (С) Всеволод Рылов, все права защищены

  27. Пример – глубокая вложенность class WithDeepNesting{ boolean toBe; WithDeepNesting(boolean b) { toBe = b;} class Nested { boolean theQuestion; class DeeplyNested { DeeplyNested(){ theQuestion = toBe || !toBe; } } } } Каждый экземпляр WithDeepNesting.Nested.DeeplyNested имеет объемлющий объект класса WithDeepNesting.Nested (его непосредственно объемлющий объект) и объемлющий объект – экземпляр класса WithDeepNesting (объемлющий объект ранга 2). (С) Всеволод Рылов, все права защищены

  28. Суперклассы и подклассы Класс C является суперклассом класса Aесли верно одно из следующих утверждений: • Aявляется непосредственным подклассомC. • Существует классBтакой , что Aявляется подклассом B, и Bявляется подклассом C, применяя это правило рекурсивно. class Point { int x, y; } class ColoredPoint extends Point { int color; } final class Colored3dPoint extends ColoredPoint { int z; } • Класс Point является суперклассом класса ColoredPoint. • Класс Point является суперклассом класса Colored3dPoint. • Класс ColoredPoint является подклассом класса Point. • Класс ColoredPoint является суперклассом класса Colored3dPoint. • Класс Colored3dPoint является подклассом класса ColoredPoint. • Класс Colored3dPoint является подклассом класса Point. (С) Всеволод Рылов, все права защищены

  29. Зависимость между классами • Классы и интерфейсы зависят по загрузке от других типов (классов и интерфейсов), приведенных в декларации наследования (extendsи implements) • Зависимость типов друг от друга может формировать цепочку: • A зависит от B, B зависит от C тогда A зависит от C. class B implements C {…} class A extends B {…} … A theA = new A(); // Будут загружены интерфейс C и //классы B и A • Циклические зависимости вызывают ошибку времени компиляции: class Point extends ColoredPoint { int x, y; } class ColoredPoint extends Point { int color; } • Если цикл обнаружен во время исполнения программы и загрузки классов в JVM, то выбрасывается ошибка ClassCircularityError (С) Всеволод Рылов, все права защищены

  30. Суперинтерфейсы класса • Суперинтерфейсами (родительскими интерфейсами) для класса являются: • Прямые суперинтерфейсы (объявленные implements) • Суперинтерфейсы прямых суперинтерфейсов • Суперинтерфесы родительского класса • Говорят, что класс реализует все свои суперинтерфейсы • У класса может быть несколько прямых суперинтерфейсов: interface One { void doIt();} interface Two { void doIt(); void doAnother();} class MyClass implements One, Two { void doIt() {} //Общая реализация для One и Two void doAnother{} } (С) Всеволод Рылов, все права защищены

  31. Грамматика объявления тела класса ClassBody: { ClassBodyDeclarationsopt } ClassBodyDeclarations: ClassBodyDeclaration ClassBodyDeclarations ClassBodyDeclaration ClassBodyDeclaration: ClassMemberDeclaration InstanceInitializer StaticInitializer ConstructorDeclaration ClassMemberDeclaration: FieldDeclaration MethodDeclaration ClassDeclaration InterfaceDeclaration ; (С) Всеволод Рылов, все права защищены

  32. Члены класса • Областью видимости члена m, объявленного или унаследованного классом C, является тело класса C, включая тела всех типов объявленных внутри C. • Если Cсам по себе является вложенным классом, то объявления одноименных членов (полей, методов или типов)m в объемлющих областях видимости (блоках, классах или пакете) будут сокрыты данным членом mкласса С. • Членами класса являются: • Члены, унаследованные от его прямого суперкласса (исключением является класс Object не имеющий суперклассов) • Члены, унаследованные от его прямых суперинтерфейсов • Члены, объявленные в теле класса • Члены класса объявленные private не наследуются подклассами. • Конструкторы и инициализаторы не являются членами и не наследуются (С) Всеволод Рылов, все права защищены

  33. Пример наследования членов class Point { int x, y; private Point() { reset(); } Point(int x, int y) { this.x = x; this.y = y; } private void reset() { this.x = 0; this.y = 0; } } class ColoredPoint extends Point { int color; void clear() { reset(); } // error – reset() is private } //error: ColoredPoint() {super();} – default constructor class Test { public static void main(String[] args) { ColoredPoint c = new ColoredPoint(0,0);//error – //ColoredPoint has no such constructor c.reset(); //error – reset() is private } } (С) Всеволод Рылов, все права защищены

  34. Наследование и доступ по умолчанию package points; public class Point3D extends Point { int z; public void move(int dx, int dy, int dz) { x += dx; y += dy; z += dz; } } package points; public class Point { int x, y; public void move(int dx, int dy) { x += dx; y += dy; } } import points.*; class Point4D extends Point3D { int w; public void move(int dx, int dy, int dz, int dw) { x+=dx; y+=dy; z+=dz; //error! w+=dw; } } import points.*; class Point4D extends Point3D { int w; public void move(int dx, int dy, int dz, int dw) { super.move(dx,dy,dz); //Good! w+=dw; } } (С) Всеволод Рылов, все права защищены

  35. Поля-члены класса (грамматика) FieldDeclaration: FieldModifiersopt Type VariableDeclarators ; VariableDeclarators: VariableDeclarator VariableDeclarators , VariableDeclarator FieldModifiers: FieldModifier FieldModifiers FieldModifier FieldModifier: one of public protected private static final transient volatile (С) Всеволод Рылов, все права защищены

  36. Статические поля class Point { int x, y, useCount; Point(int x, int y) { this.x = x; this.y = y; } final static Point origin = new Point(0, 0); } class Test { public static void main(String[] args) { Point p = new Point(1,1); Point q = new Point(2,2); p.x = 3; p.y = 3; p.useCount++; p.origin.useCount++; System.out.println("(" + q.x + "," + q.y + ")"); System.out.println(q.useCount); System.out.println(q.origin == Point.origin); System.out.println(q.origin.useCount); } } (С) Всеволод Рылов, все права защищены

  37. Singleton (объект одиночка) • Данный шаблон используется для обеспечение единственности объекта определенного класса public class Singleton { private static Singleton instance = null; private Singleton(){} //никто не может вызвать конструктор //все должны использовать данный метод для получения объекта public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } (С) Всеволод Рылов, все права защищены

  38. Поля-члены, объявленные final • Переменные классов(static)и переменные экземпляров могут быть объявлены final • Статическая переменная, объявленная finalдолжна быть инициализирована непосредственно при объявлении либо в блоке статической инициализации • Переменная экземпляра, объявленная finalдолжна быть проинициализирована непосредственно при объявлении либо в блоке инициализации, либо ей должно быть присвоено значение к концу исполнения каждогоконструктора (С) Всеволод Рылов, все права защищены

  39. Модификаторы volatile и transient Переменные, объявленные transientне являются частью persistent состояния объекта и не сохраняются во время сериализации. Для переменных, объявленных volatile, осуществляется синхронизация локальной и главной копий при каждом обращении к значению переменной в многопоточной среде. class Test { static int i = 0, j = 0; static void one() { i++; j++; } static void two() { System.out.println("i=" + i + " j=" + j); } // может напечатать j } // большее, чем i class Test { static volatile int i = 0, j = 0; static void one() { i++; j++; } static void two() { System.out.println("i=" + i + " j=" + j); } // i всегда >= j !!! } (С) Всеволод Рылов, все права защищены

  40. Инициализация полей • Инициализация полей экземпляра происходит каждый раз при создании нового объекта. • Инициализация статических полей класса происходит один раз при первом использовании класса. • При инициализации поля экземпляра могут использовать статические поля, т.к. они гарантированно инициализированы к моменту создания объекта • При инициализации статические поля класса не могут использовать поля экземпляра, а также ключевые слова thisи super • Инициализация полей происходит в порядке объявления и в порядке исполнения блоков инициализации. Константы времени компиляции инициализируются первыми. Код конструкторов исполняется в последнюю очередь • Стоит избегать зависимости от порядка инициализации полей (С) Всеволод Рылов, все права защищены

  41. Разрешение перекрытия полей class Point { static int x = 2; } class Test extends Point { static double x = 4.7; public static void main(String[] args) { new Test().printX(); } void printX() { System.out.println(x + " " + super.x); } } Для доступа к полям, перекрытым при наследовании можно использовать super, а также полную квалификацию (super.xили Point.x) (С) Всеволод Рылов, все права защищены

  42. Множественное перекрытие interface Frob { float v = 2.0f; } class SuperTest { int v = 3; } class Test extends SuperTest implements Frob { public static void main(String[] args) { new Test().printV(); } void printV() { System.out.println((super.v + Frob.v)/2); } } При множественном перекрытии необходимо использовать полную квалификацию (С) Всеволод Рылов, все права защищены

  43. Грамматика объявления метода • Метод определяет участок исполняемого кода, который может быть вызван с передачей фиксированного количества параметров определенного типа MethodDeclaration: MethodHeader MethodBody MethodHeader: MethodModifiersopt ResultType MethodDeclarator Throwsopt ResultType: Type void MethodDeclarator: Identifer ( FormalParameterListopt ) • В классе может быть объявлен метод, имя которого совпадает с именем члена-поля, вложенного класса, интерфейса или другого метода (стоит избегать!!!) (С) Всеволод Рылов, все права защищены

  44. Сигнатура метода • Методы класса должны различаться по своей сигнатуре. • Сигнатура метода определяется его именем, количеством параметров и типами этих параметров FormalParameterList: FormalParameter FormalParameterList , FormalParameter FormalParameter: finaloptType VariableDeclaratorId VariableDeclaratorId: Identifier VariableDeclaratorId [ ] • Имена параметров метода должны быть различны • Список формальных параметров метода может быть пуст (С) Всеволод Рылов, все права защищены

  45. Параметры метода • Во время вызова метода вычисленные значения передаваемых аргументов используются для инициализации переменных-параметров метода • Таким образом всегда имеет место передача «по значению» • Область видимости параметра ограничивается методом, в котором он объявлен. При этом доступ к нему осуществляется с помощью обычного имени. • Параметры перекрывают собой поля-члены класса, в котором объявлен метод, содержащий эти параметры. Для доступа к перекрытым полям-членам нужно использовать thisлибо полное квалифицированное имя • Параметры типов double и float всегда содержат значения из множества double и float соответственно. Они не могут принимать расширенных значений появляющихся во время вычисления выражений не являющихся strictfp (С) Всеволод Рылов, все права защищены

  46. Модификаторы метода MethodModifiers: MethodModifier MethodModifiers MethodModifier MethodModifier: one of public protected private abstract static final synchronized native strictfp Запрещенные комбинации: • два из public, protected, private • abstract с любым из: private, static, final, native, strictfp, synchronized • native strictfp (С) Всеволод Рылов, все права защищены

  47. Абстрактные методы • Абстрактный метод определяет сигнатуру и список выбрасываемых исключений для метода, который должен быть реализован ниже по иерархии наследования • Абстрактный класс может перегружать метод, оставляя (или делая) его абстрактным и сохраняя его сигнатуру. При этом может измениться список выбрасываемых исключений. class BufferEmpty extends Exception {…} class BufferError extends Exception {…} public interface Buffer { char get() throws BufferEmpty, BufferError; } public abstract class InfiniteBuffer implements Buffer { abstract char get() throws BufferError; } (С) Всеволод Рылов, все права защищены

  48. Осторожность при перегрузке abstract class Point { int x, y; public abstract String toString(); } class ColoredPoint extends Point { int color; public String toString() { //ошибка – вызов абстрактного метода: return super.toString() + ": color " + color; } } (С) Всеволод Рылов, все права защищены

  49. Модификаторы метода (продолжение) • В статическом методе не может использоваться ссылка this • Ссылки superи thisмогут использоваться только в методах объекта (т.е. методах, не объявленных static) Метод, объявленный final,не может быть перегружен в классах-наследниках. • Никакой метод класса, объявленного finalне может быть перегружен (так как такой класс не может иметь наследников) и, таким образом, все его методы являются final • По своей сути метод, объявленный privateявляется final • Компилятор или оптимизатор могут использовать «inline» подстановку для finalи privateметодов, тем самым увеличивая скорость исполнения программы (С) Всеволод Рылов, все права защищены

  50. Модификаторы метода (продолжение) • nativeметоды используются для реализации их тела в платформенно-зависимой библиотеке, написанной на языке C, C++, Fortran и т.д. пример: файл производного доступа package java.io; public class RandomAccessFile implements DataOutput, DataInput { . . . public native void open(String name, boolean writeable) throwsIOException; public native int readBytes(byte[] b, int off, int len) throws IOException; public native void writeBytes(byte[] b, int off, int len) throws IOException; public native long getFilePointer() throws IOException; public native void seek(long pos) throws IOException; public native long length() throws IOException; public native void close() throws IOException; } (С) Всеволод Рылов, все права защищены

More Related