[an error occurred while processing this directive]

Объектно-ориентированное программирование в Java Абстрактные методы и классы

Язык Java - одно из самых новых и модных средств программирования нашего времени. Он начинал разрабатываться как часть проекта создания передового программного обеспечения для различных бытовых приборов. Можно сказать, что он произошел от языка C++, сохранив 80% его мощности и лишь 20% сложности (первая версия языка была создана в 1995 г. и называлась Oak). Это сокращение сложности привело, как ни странно, к тому, что Java получился более "объектно-ориентированным", чем его славный предок.

 

Абстрактные методы и классы

При описании класса Pet мы не можем задать в методе voice () никакой полезный алгоритм, поскольку у всех животных совершенно разные голоса.

В таких случаях мы записываем только заголовок метода и ставим после закрывающей список параметров скобки точку с запятой. Этот метод будет абстрактным (abstract), что необходимо указать компилятору модификатором abstract .

Если класс содержит хоть один абстрактный метод, то создать его экземпляры, а тем более использовать их, не удастся. Такой класс становится абстрактным, что обязательно надо указать модификатором abstract .

Как же использовать абстрактные классы? Только порождая от них подклассы, в которых переопределены абстрактные методы. Романский стиль Билеты по истории искусства

Зачем же нужны абстрактные классы? Не лучше ли сразу написать нужные классы с полностью определенными методами, а не наследовать их от абстрактного класса? Для ответа снова обратимся к листингу 2.2.

Хотя элементы массива singer [] ссылаются на подклассы Dog, Cat, Cow , но все-таки это переменные типа Pet и ссылаться они могут только на поля и методы, описанные в суперклассе Pet . Дополнительные поля подкласса для них недоступны. Попробуйте обратиться, например, к полю k класса Dog , написав singer [0].k . Компилятор "скажет", что он не может реализовать такую ссылку. Поэтому метод, который реализуется в нескольких подклассах, приходится выносить в суперкласс, а если там его нельзя реализовать, то объявить абстрактным. Таким образом, абстрактные классы группируются на вершине иерархии классов.

Кстати, можно задать пустую реализацию метода, просто поставив пару фигурных скобок, ничего не написав между ними, например:

void voice(){}

Получится полноценный метод. Но это искусственное решение, запутывающее структуру класса.

Замкнуть же иерархию можно окончательными классами. Примером такой службы может быть многопотоковая Java-программа, обеспечивающая сокеты для данного порта. Сокет (в переводе с английского - гнездо, патрон) - это абстракция сетевого программного обеспечения, которая дает возможность осуществлять соединения с сетевой программой и обмениваться с ней входными и выходными данными. Простейшим методом организации обмена является установление обычных потоков ввода-вывода от сервера клиенту и наоборот. Для одного порта можно создать несколько клиентских сокетов, что позволяет нескольким пользователям получать доступ к данной службе.
Если клиентом является Java-программа, то она также должна иметь сокет и потоки, соответствующие аналогичным потокам сервера. Клиентом может быть и служебная программа, такая, как telnet.

Пример 2. ATM (automated teller machine) - банкомат. Эта программа имитирует соединение с банком и проверку достоверности вводимого клиентом личного идентификациоонного номера (PIN-кода). В качестве клиентской программы используется telnet - подключение нужно проводить к серверу localhost и порту 8190.

import java.io.*;
import java.net.*;

class ATMServer {
/* Простая серверная программа, J M Bishop Декабрь 1996
* =======================
* Java 1.1 обновлено Январь 1998
* Java 1.2 B Worrall Август 2000
* Позволяет выполнять много одновременных подключений.
* Иллюстрирует использование сокетов и работу в сети. */


static final String magicPIN = "5678";
static int port = 8190;
InetAddress serverAddress = null;
private boolean done = false;

public static void main(String[] args) {
// Получает номер порта из строки параметров
// или назначает значение по умолчанию 8190
if (args.length > 0)
port =Integer.parseInt(args[0]);
new ATMServer (port);
}

ATMServer (int port) {

try {
serverAddress = InetAddress.getLocalHost();
} catch (UnknownHostException e) {}

// Информация при запуске сервера

System.out.println("****** Саванна банк ********");
System.out.println("Имитирует сеанс ATM "
+ "для клиентов, подключающихся через telnet к серверу ");
System.out.println(serverAddress.getHostName() +
"к порту "+port);
System.out.println("от любого количества компьютеров или ");
System.out.println("из любого количества окон.");

// Инициализирует ServerSocket
try {
ServerSocket listener = new ServerSocket(port);

int c = 0;
while (!done) {
// Создается пауза ожидания клиентских подключений
Socket client = listener.accept( );
c++;
System.out.println("Кредитная карточка вставлениа в " +
client.getInetAddress().getHostName());
System.out.println("Начало обслуживания "+
"нового клиента под номером "+c);
new handler(client, c).start();
}
listener.close();
}
catch (IOException e) {
System.out.println("Порт "+port+
", возможно, занят. Попробуйте еще раз.");
}
}

void closeDown () {
done = true;
}

class handler extends Thread {

private Socket toClient;
private int id;

handler(Socket s, int i) {
// Запоминает номер сокета и клиентский ID
toClient = s;
id = i;
}

public void run() {

try {
DataInputStream conin =
new DataInputStream (toClient.getInputStream());
PrintWriter conout = new
PrintWriter(toClient.getOutputStream(),true);

conout.println( "Welcome to Savanna bank");
for (int tries = 0; tries < 3; tries++) {
conout.println("Please, enter your PIN-code "+
"or CANCEL");
String s = conin.readLine();
System.out.println("Клиент "+id+":"+s);

if (s.equals("SHUTDOWN")) closeDown();
else if (s.equals("CANCEL")) {
conout.println("Transaction is complete. Goodbye.");
break;
}
else if (s.equals(magicPIN)) {
conout.println("You can begin a transaction");
break;
}
else
conout.println("Incorrect PIN-code."+
"Try again.");
}
System.out.println("Имитация завершена. Спасибо.");
conout.println("-------------------------");
conout.println("Imitation is complete. Thanks.");
}
catch (IOException e) {System.out.println("IO Error");}
}
}
}

Номер порта программа получает из командной строки или назначает по умолчанию порт 8190.

 

Математический анализ, лекции по физике Компьютерные сети