Класс "мыша"
Mouse{
x // переменные внутри класса - "поля" или
y // "свойства"
draw() // функция внутри класса = "метод"
}
Формальное описание синтаксиса класса:
class Name {
int x, y;
тело класса;
int Sum (int a, int b){} // описание функций
float z; // в любом порядке описание переменных и функций..
// хотя для читабельности все лучше по порядку
}
Класс не похож на функцию, не возвращает никакого значения.
Тут используют описания доступа к переменным (полям то есть) класса и к его функциям (методам то есть). По умолчанию переменные и функции доступны для своего класса и всех его соседей в той же папке.
По сути класс - что это? Это сложная структура в памяти. Выделяем 4 байта для целого, 4 байта для вещественного, и описываем структуру функции для работы с ними. Но это лишь описание - реально память не выделена. Память выделяется реально - создается объект. То есть конкретный экземпляр класса. Я месяца три после процедурного программирования не мог привыкнуть к терминологии и не мог понять, зачем же это нужно! Попытаюсь вам объяснить все же побыстрее :-)
Класс "люди"
голова
руки
метод_думать (увеличивает значение голова на 1)
метод хватать (увеличивает значение рук на 1)
все
Мы все - объекты=экземпляры этого класса. Нам выделено место на земле чтобы жить, хватать и думать.
Внутри класса помимо всего прочего существует специальная функция - "конструктор" - называется функция тем же именем, что и класс (в этом примере - "люди"). Она может существовать или не существовать. Она не возвращает никакого результата и void к конструктору не надо приписывать. Она - функция-конструктор - нужна для некоторых начальных (инициализирующих) действий при создании объекта. Какие действия? Разные..
В нашем примере: конструктор присвоит головам и рукам значение "десять". Это я придумываю сам. Пусть будет так. Или пример с мышой: пусть мыша будет при инициализации располагаться в центре экрана. Кто-то должен вычислить координаты центра экрана и вызвать функцию рисования чтобы там мыша была нарисована.
Когда объект создается (человек рождается), то вызывается один-единственный раз конструктор. Если я не описал спец. конструктор, то что по умолчанию? Обычно ничего. Но если и ничего, все же по умолчанию конструктор есть. Хотя по умолчанию он ничего не совершает, ничего не возвращает, никаких аргументов не получает.
Вернемся к примеру Люди: создаем объект Миша класса Люди -
1) объявили переменную сложного типа "Люди" (так как мы писали int a;
при объявлении переменной простого типа)
Люди Миша; // никакая память не выделилась, переменной
// спец_типа Люди - нет, ее "значение" - null
// в отличие от случая простой переменной - она то
// "инициализируется" автоматически
2) выделили оперативную память для объекта Миша:
Миша=new Люди();
Теперь возник кусок выделенной памяти - конструктор там создал структуру для хранения переменных руки, голова, функций-методов.
Разница с обычным программированием: функция делается менее универсальной. Она может работать только над данными данного объекта! Нельзя заставить функцию-метод объекта взять переменную другого объекта. (можно ей передать извне эти переменные-поля как аргументы). Зато (выигрыш) все это дело увязано в одну взаимосвязанную структуру. Еще раз: даже если метод-функцию вызвать снаружи, она чужие данные не сможет взять. А как же передают данные внутрь переменных-полей объекта? Прямой записью в поле или передачей данных внутрь через функцию-метод, ему эти данные дают в качестве аргумента.
Уничтожение объектов. В отличие от Си++ в Java нет Деструктора. Я пишу
Миша = null;
Объект "Миша" не сразу убивается-освобождает память. Он просто лежит тут, ненужный Миша. А потом, в момент регулярной чистки памяти, его уберут. Java -машина чистит память регулярно.
Листинг программы – SearchEngein.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.*;
// Класс Интерфейс
public class SearchEngein extends HttpServlet {
// Объявление глобальных переменных
Properties INIProperties = new Properties();
String query = null, // Запрос
value = null; // Запрос в нужной кодировке
String dbname, // Имя базы
dbpath; // Путь к базе
String dbselect; //
byte MD = 30, // Код разделителя
MD2 = 31; // Код разделителя
String RusDos = new String("Cp866"); // Кодировка дос
String RusWin = new String("windows-1251"); // Кодировка Виндовс
String iso = new String("8859_1"); // Кодировка Сервлета
String RusIso = new String("8859-5"); // Кодировка Исо
// конвертор кодировки из ИСО В Виндовс
private String ConvertISO(String Str) {
try {
Str = new String( Str.getBytes(iso),RusWin);}
catch( java.io.UnsupportedEncodingException e ) { return Str;}
return Str;
}
public String getServletInfo() {
return "Поиск в базе данных ";
}
private String RemoveTrash(String str){
return new String(str);
}
// преобразование в нижний регистр
public String toLow(String str){
char old[] = str.toCharArray();
char news[] = new char[str.length()];
char c;
for (int i =0; i<str.length(); i++){
c = old[i];
switch (c) {
case 'А' : {c = 'а';break;}
case 'Б' : {c = 'б';break;}
case 'В' : {c = 'в';break;}
case 'Г' : {c = 'г';break;}
case 'Д' : {c = 'д';break;}
case 'Е' : {c = 'е';break;}
case 'Ё' : {c = 'ё';break;}
case 'Ж' : {c = 'ж';break;}
case 'З' : {c = 'з';break;}
case 'И' : {c = 'и';break;}
case 'Й' : {c = 'й';break;}
case 'К' : {c = 'к';break;}
case 'Л' : {c = 'л';break;}
case 'М' : {c = 'м';break;}
case 'Н' : {c = 'н';break;}
case 'О' : {c = 'о';break;}
case 'П' : {c = 'п';break;}
case 'Р' : {c = 'р';break;}
case 'С' : {c = 'с';break;}
case 'Т' : {c = 'т';break;}
case 'У' : {c = 'у';break;}
case 'Ф' : {c = 'ф';break;}
case 'Х' : {c = 'х';break;}
case 'Ц' : {c = 'ц';break;}
case 'Ч' : {c = 'ч';break;}
case 'Ш' : {c = 'ш';break;}
case 'Щ' : {c = 'щ';break;}
case 'Ъ' : {c = 'ъ';break;}
case 'Ы' : {c = 'ы';break;}
case 'Ь' : {c = 'ь';break;}
case 'Э' : {c = 'э';break;}
case 'Ю' : {c = 'ю';break;}
case 'Я' : {c = 'я';break;}
default : {news[i]=c;}
}// switch
news[i] = c;
}
return new String(news);
}
//
private String TagRemove(String s){
boolean inTag = false;
boolean tag = false;
int sn = 0;
char c;
int m = s.length();
char[] cd = new char[m];
char[] old = s.toCharArray();
char cMD = (char) MD2;
for (int i=0; i<m; i++)
{c=old[i];
if (tag) { c=' '; tag = false; }
else if ( c == cMD ) { c=' '; tag = true;}
cd[i] = c;
}
return new String(cd);
}
//
public void dbFileRead(String dbNamePath, PrintStream out, String query) {
String mAvtor = null; // 100
String msAvtor = null; // 700
String mName = null; // 245
String mPrinter = null; // 260
String mSize = null; // 300
String mKey = null; // 653
String mSeria = null; // 490
String mBBK = null; // 91
String mKaIndex = null; // 90
long fPosMarker = 0, // Позиция относительно начала
fPosData = 0; //
boolean done = false,
Avtor = false;
int mC =0,
mE =0; // Счетчик
byte Jumper[] = new byte[5]; // Размер запяси - символьный
int JIndex = 0, // Размер запяси - числовой
JTemp = 0, // Размер данных + словарь
MIndex = 0, // Счетчик для массива
MTemp = 0; // Счетчик полей
if (query != null){
try { RandomAccessFile dbfile = new RandomAccessFile(dbNamePath,"r");
// Цикл чтения файла по маркерам
while (fPosMarker != dbfile.length()) {
try { mC++;
dbfile.seek(fPosMarker);
dbfile.read(Jumper);
String jBuf = new String(Jumper);
JIndex = Integer.parseInt(jBuf,10);
int b = 0;
// Поиск конца словаря
while ( b != MD){
dbfile.seek(fPosMarker+24+MIndex);
b = dbfile.read();
MTemp++;
MIndex = MTemp;
}
MTemp= MTemp - 1;
// чтение Словаря из файла в отдельный массив
byte Dic[] = new byte[MTemp];
dbfile.seek(fPosMarker+24);
dbfile.read(Dic);
// чтение полей данных из файла в массив
fPosData = fPosMarker+24+MTemp;
String sDic = new String(Dic);
byte MarcRec[] = new byte[JIndex-24-MTemp];
dbfile.seek(fPosData);
dbfile.read(MarcRec);
int DI2 = 0,
DI3 = 0,
DI4 = 0,
DI5 = 0,
PNum = 0, // Номер поля числовой