Программирование на языке Java

       

Inside B's calime method


СОВЕТ

Программистам Delphi / C++ следует отметить, что все Java по умолчанию являются виртуальными функциями (ключевое слово virtual).

Рассмотренная форма динамического полиморфизма времени выполнения представляет собой один из наиболее мощных механизмов объектно-ориентированного программирования, позволяющих писать надеж­ный, многократно используемый код.

final

Все методы и переменные объектов могут быть замещены по умолча­нию. Если же вы хотите объявить, что подклассы не имеют права за­мещать какие-либо переменные и методы вашего класса, вам нужно объ­явить их как final (в Delphi / C++ не писать слово virtual).

final int FILE_NEW = 1;

По общепринятому соглашению при выборе имен переменных типа final — используются только символы верхнего регистра (т.е. используются как аналог препроцерных констант C++). Использование final-методов порой приводит к выигрышу в скорости выполнения кода — поскольку они не могут быть замещены, транслятору ничто не мешает заменять их вызовы встроенным (in-line) кодом (байт-код копируется непосредственно в код вызывающего метода).

finalize

В Java существует возможность объявлять методы с именем finalize. Методы finalize аналогичны деструкторам в C++ (ключевой знак ~) и Delphi (ключевое слово destructor). Исполняющая среда Java будет вызывать его каждый раз, когда сборщик мусора соберется уничтожить объект этого класса.

static



Иногда требуется создать метод, который можно было бы использо­вать вне контекста какого-либо объекта его класса. Так же, как в случае main, все, что требуется для создания такого метода — указать при его объ­явлении модификатор типа static. Статические методы могут непосред­ственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок this и super. Перемен­ные также могут иметь тип static, они подобны глобальным перемен­ным, то есть доступны из любого места кода. Внутри статических методов недопустимы ссылки на переменные представителей. Ниже приведен пример класса, у которого есть статические переменные, статический метод и статический блок инициализации.


class Static {



static int a = 3;



static int b;



static void method(int x) {



System.out.println("x = " + x);



System.out.println("a = " + a);



System.out.println("b = " + b);



}



static {



System.out.println("static block initialized");



b = a * 4;



}



public static void main(String args[]) {



method(42);



} }



Ниже приведен результат запуска этой программы.

С:\> java Static static block initialized

Х = 42



А = 3



B = 12



В следующем примере мы создали класс со статическим методом и несколькими статическими переменными. Второй класс может вызывать статический метод по имени и ссылаться на статические переменные непосредственно через имя класса.

class StaticClass {



static int a = 42;



static int b = 99;



static void callme() {



System.out.println("a = " + a);



} }



class StaticByName {



public static void main(String args[]) {



StaticClass.callme();



System.out.println("b = " + StaticClass.b);



} }



А вот и результат запуска этой программы:

С:\> Java StaticByName

а = 42 b = 99



 



abstract



Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов от­сутствует. В таких случаях вы можете с помощью модификатора типа ab­stract объявить, что некоторые из методов обязательно должны быть заме­щены в подклассах. Любой класс, содержащий методы abstract, также должен быть объявлен, как abstract. Поскольку у таких классов отсутствует полная реализация, их представи­телей нельзя создавать с помощью оператора new. Кроме того, нельзя объ­являть абстрактными конструкторы и статические методы. Любой под­класс абстрактного класса либо обязан предоставить реализацию всех абстрактных методов своего суперкласса, либо сам должен быть объявлен абстрактным.

abstract class A {



abstract void callme();



void metoo() {



System.out.println("Inside A's metoo method");



} }



class B extends A {



void callme() {



System.out.println("Inside B's callme method");



} }



class Abstract {



public static void main(String args[]) {



A a = new B():



a.callme():



a.metoo():



} }



В нашем примере для вызова реализованного в под­классе класса А метода callme и реализованного в классе А метода metoo используется динамическое назначение методов, которое мы обсуждали раньше.

С:\> Java Abstract


Содержание раздела