- •Программирование на основе классов в Java…………………...5
- •Создание и использование классов в Java………………………38
- •Разработка системы Деканат на Java……………………………59
- •Введение
- •Глава 1. Программирование на основе классов в Java.
- •1.1.Понятие и виды классов Java.
- •1.2. Внутренние и вложенные классы Java.
- •1.3. Классы Java для работы с потоками.
- •1.4. Программирование на основе классов Java
- •Глава 2. Создание и использование классов в Java.
- •2.1. Создание класса на языке Java.
- •2.2. Методы в классах Java.
- •Глава 3. Разработка системы Деканат на Java.
- •3.1. Система Деканат.
- •Создание Gui с помощью пакета Swing.
- •Заключение.
- •Список литературы.
2.2. Методы в классах Java.
Метод определяется, как действительная реализация некоторой операции с объектом.
Например:
access_specifier modifier datatype method_name (parameter_list)
{
// тело метода
}
Метод всегда вызывается относительно одного из объектов соответствующего класса. Внутри метода нет необходимости повторно определять текущий объект.
Пример использования метода:
class
Temp { static
int num = 10; public
static void show() {
System.out.println(num); } public
static void main(String [] arg) {
Temp t1 = new Temp();
t1.show();
Temp
t2 = new Temp();
t2.num = 20;
t2.show(); } }
Методы возвращают значения в вызывающую программу с помощью оператора return. Многие методы требуют передачи им параметров.
Параметры позволяют обобщить применение метода. void – невозвращаемый значение тип метода.
Передача по значению
Передача по значению означает, что, когда мы вызываем метод, передаем копию значения каждого фактического параметра методу.
Можем изменить эту копию в методе, но это никак не отразиться на фактическом параметре.
int x=5;
doStuff(x);
…
void doStuff (int y) {
использование у
}
Ссылка this
Ключевое слово this связано с объектом.
Оно используется, чтобы указать текущий объект.
int x;
PassTest (int x) {
this.x=x;
}
Модификаторы доступа
Модификаторы управления доступом определяют правила доступа к полям или методам.
По умолчанию переменные, методы и классы имеют тип protected.
public |
общий доступ, для любых объектов и извне |
private |
частный доступ, только из методов данного класса |
private protected |
защищенный доступ, только из методов данного класса и его производных классов |
protected |
защищенный доступ, из методов данного класса и его производных классов, а также из классов, определенных в том же пакете (каталоге) |
Преимущества методов:
Методы обеспечивают доступ к данным класса. Нельзя обращаться непосредственно к данным объекта, к ним можно обратиться только через методы.
Программа может быть разделена логически.
Нет никакой потребности, повторять один и тот же набор конструкций снова и снова. Можно объявить отдельный метод, который будет вызываться, когда потребуется.
Программы становятся легко отлаживаемые.
Типы методов:
Перегруженные методы – это методы, которые находятся в том же самом классе и имеют то же самое имя, но различные списки параметров.
public void add (int a, int b){
int c=a+b;
System.out.println(c);
}
public void add (float a, float b){
float c=a-b;
System.out.println(c);
}
Переопределенные методы – это методы, которые находятся в суперклассе так же как и в подклассе.
Замещение и перегрузка методов
Характеристики замещаемых методов:
Определяются как в суперклассе, так и в подклассе. Переопределяются в подклассе.
Характеристики перегружаемых методов:
Определены в одном и том же классе, имеют одно и то же имя, имеют различные списки параметров
Объектная инициализация
В начале создания объекта JVM распределяет достаточное место в динамической области памяти, чтобы разместить переменные образца объекта.
Когда память распределена, в ней могут содержаться различные типы данных.
Перегрузка конструктора
Перегрузка конструктора обеспечивает способ создания объектов с или без начальных параметров, в зависимости от необходимости.
public class PassTest {
PassTest (){
….
}
PassTest (int x) {
….
}
…
PassTest test1= new Passtest();
PassTest test2=new Passtest (10);
Наследование
Не менее важной характеристикой объектно-ориентированного языка программирования является наследование.
Суть наследования состоит в создании производного класса, который имеет возможности базового класса плюс свои собственные возможности.
Говорят, что производный класс расширяет (extends) базовый класс.
Любой производный класс может расширять только один базовый класс.
Набор атрибутов класса наследуется всеми подклассами, определёнными, как производные от этого класса.
Класс, который получен наследованием от другого класса, называется подклассом (subclass).
Класс, от которого получен наследованием другой класс, называется суперклассом (superclass).
Подкласс (Subclass) является специализацией суперкласса (superclass) и может получать доступ ко всем экземплярам переменных и методов, определённых в суперклассе.
Чтобы выполнить наследование класса, необходимо использовать ключевое слово extends в определении подкласса.
class Programmer extends Employee { }
Класс Object
Класс Object не является ничьим наследником, от него начинается иерархия любых классов Java.
Метод equals() сравнивает содержимое объектов в их текущем состоянии, фактически он реализован в классе Object как тождество: объект равен только самому себе.
Второй метод класса Object, который следует переопределять в подклассах, — метод toString (). Это метод без параметров, который пытается содержимое объекта преобразовать в строку символов и возвращает объект класса String.
Ключевое слово super
В производном классе функции базового класса могут быть переопределены. При использовании переопределенных функций в производных классах может возникнуть необходимость явно вызвать функцию базового класса. Для этого используется выражение:
super.имяФункции(параметры);
Ключевое слово super предназначено для вызова конструктора суперкласса.
Ключевое слово super может быть также использовано для обращения к методам или экземплярам переменных суперкласса.
Пакеты все классы Java распределяются по пакетам.
Пакет- это совокупность классов, интерфейсов и других пакетов. Каждый пакет образует одно пространство имен (namespace). Это означает, что все имена классов, интерфейсов и подпакетов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные единицы. Чтобы создать пакет надо просто в первой строке Java-файла с исходным кодом записать строку package имя: package mypack;
Включение пакета
Синтаксис команды включения пакета: import package_name.*;
Символ * используется, чтобы импортировать все классы текущего пакета.
Чтобы включить определенный класс/интерфейс, найденный в пакете используют: import package_name.class_name;
Объявление методов
Методы - это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне, что и переменные объектов. При объявлении метода задаются тип возвращаемого им результата и список параметров. Общая форма объявления метода такова:
тип имя_метода (список формальных параметров) {
тело метода:
}
Тип результата, который должен возвращать метод может быть любым, в том числе и типом void - в тех случаях, когда возвращать результат не требуется. Список формальных параметров - это последовательность пар тип-идентификатор, разделенных запятыми. Если у метода параметры отсутствуют, то после имени метода должны стоять пустые круглые скобки.
class Point { int х, у;
void init(int a, int b) {
х = а;
У = b;
} }
Вызов метода
В Java отсутствует возможность передачи параметров по ссылке на примитивный тип. В Java все параметры примитивных типов передаются по значению, а это означает, что у метода нет доступа к исходной переменной, использованной в качестве параметра. Заметим, что все объекты передаются по ссылке, можно изменять содержимое того объекта, на который ссылается данная переменная.
Скрытие переменных представителей
В языке Java не допускается использование в одной или во вложенных областях видимости двух локальных переменных с одинаковыми именами. Интересно отметить, что при этом не запрещается объявлять формальные параметры методов, чьи имена совпадают с именами переменных представителей. Для примера я рассмотрел иную версию метода init, в которой формальным параметрам даны имена х и у, а для доступа к одноименным переменным текущего объекта используется ссылка this.
Конструкторы
Инициализировать все переменные класса всякий раз, когда создается его очередной представитель — довольно утомительное дело даже в том случае, когда в классе имеются функции, подобные методу init. Для этого в Java предусмотрены специальные методы, называемые конструкторами. Конструктор — это метод класса, который инициализирует новый объект после его создания. Имя конструктора всегда совпадает с именем класса, в котором он расположен (также, как и в C++). У конструкторов нет типа возвращаемого результата - никакого, даже void. Заменим метод init из предыдущего примера конструктором.
Совмещение методов
Язык Java позволяет создавать несколько методов с одинаковыми именами, но с разными списками параметров. Такая техника называется совмещением методов (method overloading). В качестве примера приведена версия класса Point, в которой совмещение методов использовано для определения альтернативного конструктора, который инициализирует координаты х и у значениями по умолчанию (-1).
Замещение методов
Новый подкласс Point3D класса Point наследует реализацию метода distance своего суперкласса (пример PointDist.java). Проблема заключается в том, что в классе Point уже определена версия метода distance(mt х, int у), которая возвращает обычное расстояние между точками на плоскости. Мы должны заместить (override) это определение метода новым, пригодным для случая трехмерного пространства. В следующем примере проиллюстрировано и совмещение (overloading), и замещение (overriding) метода distance.
Динамическое назначение методов
В качестве примера рассмотрю два класса, которое имеет простое родство, подкласс / суперкласс, причем единственный метод суперкласса замещен в подклассе.
class A { void callme() {
System.out.println("Inside A's callrne method");
class В extends A { void callme() {
System.out.println("Inside B's callme method");
} }
class Dispatch {
public static void main(String args[]) {
A a = new B();
a.callme();
} }
Обращу внимание — внутри метода main мы объявили переменную А класса, а проинициализировали ее ссылкой на объект класса В. В следующей строке мы вызвали метод callme. При этом транслятор проверил наличие метода callme у класса А, а исполняющая система, увидев, что на самом деле в переменной хранится представитель класса В, вызвала не метод класса А, а callme класса В. Ниже приведенрезультат работы этой программы:
Inside B's calime method
final
Все методы и переменные объектов могут быть замещены по умолчанию. Если же вы хотите объявить, что подклассы не имеют права замещать какие-либо переменные и методы вашего класса, вам нужно объявить их как final (в Delphi / C++ не писать слово virtual).
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);
} }
B = 12
В следующем примере было применено класс со статическим методом и несколькими статическими переменными. Второй класс может вызывать статический метод по имени и ссылаться на статические переменные непосредственно через имя класса. Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов отсутствует. В таких случаях вы можете с помощью модификатора типа abstract объявить, что некоторые из методов обязательно должны быть замещены в подклассах. Любой класс, содержащий методы 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 используется динамическое назначение методов.
