1 Методы Java Методы класса – это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне,

Презентация:



Advertisements
Похожие презентации
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Advertisements

Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Основы информатики Лекция. Функции Заикин Олег Сергеевич
Лекция 2: Описание класса 1. Поля 2. Методы 3. Конструкторы.
Переменные и основные типы переменных на JAVA Выполнил учитель информатики и ИКТ МБОУ СОШ р.п. Евлашево Горелочкин Н.К.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП) 1.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
b5_java_s4
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
1 Контрольное зачетное задание (0, 0)(0, m-1) (n-1, 0)(n-1, m-1) Дано прямоугольное поле, расчерченное на клетки: n клеток в высоту и m клеток в ширину.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Существует три разновидности комментариев: комментарии в одной строке, комментарии в нескольких строках, комментарии для документирования. Комментарии,
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Лекция 10. Введение в ООП. Часть 3 Красс Александр СПбГУ ИТМО, 2008.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Транксрипт:

1 Методы Java Методы класса – это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне, что и поля. При объявлении метода задаются тип возвращаемого им результата и список параметров. Общая форма объявления метода, которая называется сигнатурой, такова: имя_метода (список формальных параметров) { /* тело метода:*/ } Спецификатор доступа (public, private, protected или отсутствует) - указание на то, кто и как может использовать данный метод. static (или его отсутствие) – определяет, каким образом данный метод будет использоваться: без объявления конкретного экземпляра класса (только для объявленного объекта). Возвращаемый тип - это тип значения, которое помещается в память из метода после его вызова. Тип результата может быть любым, в том числе и типом void - в тех случаях, когда возвращать результат не требуется. Список формальных параметров - это последовательность пар тип-идентификатор, разделенных запятыми. Если у метода параметры отсутствуют, то после имени метода должны стоять пустые круглые скобки. Список аргументов дает типы и имена, чтобы было понятно, что необходимо передать в этот метод. Имя метода и список аргументов вместе уникально идентифицируют метод.

2 Методы Java Классификация методов Java Методы main() и paint(). Вызываются для определения точки начала выполнения приложения или апплета. Конструкторы. Вызываются для создания новых экземпляров некоторого класса и инициализации их. Деструкторы. Вызываются, когда работа с экземпляром класса закончена и мы хотим вручную уничтожить объект, освободив при этом память. Копировщики. Вызываются для копирования содержимого одного экземпляра объекта в другой. Set-методы. Вызываются для присвоения значения переменной или свойству класса. Get-методы. Вызываются для считывания значения переменной или свойства класса. Методы ввода/вывода. Вызываются для выполнения взаимодействия с внешним устройством. Методы специфические. Создаются для выполнения специфических функций приложения или апплета (класса) в соответствии с проектируемой задачей.

3 Методы Java Конструкторы Специальные методы, предназначенные для гарантированной инициализации всех переменных класса при создании его представителей (экземпляров). Инициализировать переменные класса каждый раз при создании нового экземпляра класса довольно утомительное дело, даже когда в классе имеются функции (методы), подобные методу init. Конструктор - это метод класса, который инициализирует новый объект после его создания. Если класс имеет конструктор, Java автоматически вызывает конструктор при создании объекта, прежде чем программа начнет его использовать. Поэтому инициализация гарантируется. Имя конструктора всегда полностью совпадает с именем класса, в котором он расположен. Т.е. это единственный вид методов, сигнатура которых не совпадает с общей формой: 1. Имя конструктора начинается с большой буквы (как и имя класса) 2. У конструкторов нет типа возвращаемого результата - никакого, даже void. Такое соглашение позволяет легко реализовать автоматическую инициализацию при объявлении объекта класса.

4 Методы Java class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } class PointCreate { public static void main(String args[]) { Point p = new Point(10,20); System.out.println("x = " + p.x + " у = " + p.у); } Когда объект создан: Point p = new Point(10,20); место хранения зарезервировано (оператор new) и конструктор вызван (переменные класса получили конкретные значения). Это гарантирует то, что объект будет правильно инициализирован прежде, чем будет использован. Замена метода init(…) на конструктор Вызов конструктора при создании экземпляра класса Point

5 Методы Java Как и любой другой метод, конструктор может иметь или не иметь аргументы, которые позволяют указать способ передачи параметров для инициализации при создании объекта. Приведенный выше пример показывает, как конструктор получает аргументы. Если используется конструктор без аргументов (он называется конструктором по умолчанию), то при объявлении нового объекта происходит только выделение памяти. Если класс не имеет явно написанных конструкторов, компилятор автоматически создает (дописывает за нас) конструктор по умолчанию (т.е. конструктор без аргументов) и включает его в код программы. class Bird { int i; } public class DefaultConstructor { public static void main(String[] args) { Bird nc = new Bird(); // по умолчанию!} Строка new Bird() создает новый объект и вызывает конструктор по умолчанию, даже несмотря на то, что он не был явно определен. Переменная класса i автоматически инициализируется нулем. Без этого не было бы способа построения нашего объекта.

6 Методы Java Однако, если в описании класса определен любой конструктор (с аргументами или без них) компилятор не будет синтезировать ничего. class Bush { int i; Bush(int i) { } … Если при создании экземпляра класса сделать: new Bush(); // попытка вызова конструктора по умолчанию компилятор заявит, что он не может найти соответствующий конструктор. Когда в классе не определено ни одного конструктора, компилятор «говорит»: Класс обязан иметь хоть какой-нибудь конструктор, так что позвольте мне создать конструктор по умолчанию за вас. Но если конструктор написан, компилятор «говорит»: Вы написали конструктор, так что вы знаете, что делаете. Если вы не создали конструктор по умолчанию, это значит, что он вам не нужен

7 Методы Java Инициализация переменных класса в конструкторе не препятствует их автоматической или явной инициализации, которая происходит в точке определения. class Counter { int i; // или, например, int i = 3; Counter() { i = 7; } //... i сначала будет инициализирована 0 ( или 3), а затем в конструкторе 7. Порядок инициализации Объявления переменных класса может быть разбросано между определением конструкторов и обычных методов. Однако инициализация переменных класса происходит прежде, чем может быть вызван любой метод (даже конструктор).

8 Методы Java Перегрузка конструкторов и методов Большинство языков программирования (в частности Cи) требуют использования уникальных идентификаторов для каждой функции. Ранее до Java было невозможно иметь в программе одной функции с именем print( ) для печати целых чисел и другой с тем же именем print( ) для печати чисел с плавающей точкой каждая функция в Си требует уникального имени. Но ведь в обоих случаях: при печати и целых, и вещественных чисел, – концептуально выполняется одно и то же действие – вывод информации во внешний файл. Ситуация, когда одно и то же слово несет несколько различных смыслов, называется перегрузкой. Java позволяет использовать одно имя для методов, которые можно объединить в рамках одной содержательной концепции. Например собрать под единым именем print() все методы, которые печатают числа всех примитивных числовых типов. Поскольку java-методы однозначно идентифицируются именем и списком формальных параметров, то void print(int x) {…} и void print(double x) {…} – разные (ПЕРЕГРУЖЕННЫЕ) методы.

9 Методы Java Важнейшей причиной использования перегрузки методов в Java являются конструкторы. Поскольку имя конструктора предопределено и должно в точности совпадать с именем класса, то ни под каким другим именем конструктор не может быть включен в класс. Что делать, если необходимо создавать объект более чем одним способом? Например, строится класс Point – «точка на плоскости», который может инициализировать себя стандартным способом (в начало координат – 0,0) или путем задания конкретных декартовых координат, т.е. пары чисел. Тогда нужно иметь два конструктора, один не принимает аргументов (конструктор по умолчанию), а другой принимает в качестве аргументов два целых числа, которые являются координатами точки на плоскости, инициализирующими объект. Оба они являются конструкторами, так что они должны иметь одно имя, совпадающее с именем класса. Таким образом, перегрузка методов необходима для получения возможности использования одного и того же имени метода с разным набором аргументов. Перегрузка методов необходима для конструкторов, но является общим соглашением и может использоваться для любого метода.

10 Методы Java class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { х = 0; у = 0; } public static void main(String args[]) { Point p1 = new Point(); System.out.println("x1 = " + p1.x + " у1 = " + p1.y); Point p2 = new Point(10,20); System.out.println("x2 = " + p2.x + " у2 = " + p2.y); p1.x +=p2.x; p1.y -=p2.y; System.out.println("x1 = " + p1.x + " у1 = " + p1.y); } Вывод программы: х1 = 0 у1 = 0 x2 = 10 y2 = 20 x1 = 10 y1 = -20 Объекты класса Point (p1 и p2) создаются разными конструкторами. Решение о том, какой конструктор нужно вызвать принимается в соответствии с количеством и типом параметров, указанных в операторе new. Перегрузка конструкторов Недопустимо объявлять в классе методы с одинаковыми сигнатурами (имя и список формальных параметров). В сигнатуре метода не учитываются имена формальных параметров, учитываются лишь их типы и количество.

11 Методы Java Перегрузка по возвращаемому значению не допустима в Java Почему только имена классов и список аргументов метода могут быть различием методов? Почему не делать различия между методами, основываясь на их возвращаемом значении? Например, методы имеют одинаковое имя и список аргументов, но легко отличаются друг от друга: void f() {…} int f() {…} Это работает, когда компилятор может недвусмысленно определить смысл из контекста, как в случае int x = f( ). Метод может быть вызван с игнорированием возвращаемого значения (побочное действие вызова метода), когда ожидается другой эффект от вызова метода. f(); Как Java может определить какой из методов f( ) должен быть вызван? 1. Различение методов при перегрузке по типу возвращаемого значения недопустимо. 2. Перегруженные методы могут иметь одинаковый или разные типы возвращаемых значений (это не проверяется компилятором).

12 Методы Java import java.util.*; class Point { static int numP; int x; int y; String nameP; Point() { Point.numP = 0; nameP = "Начало координат"; } Point(int x, int y) { String s =""; this.x = x; this.y = y; Point.numP++; nameP = "Точка" + s.valueOf(Point.numP); } /* Конструкторы и методы. Перегрузка. * файл PointDist.java * Использование возможностей static переменных */ Переменные класса: numP – количество объявленных экземпляров класса Point; x и y – координаты точки, nameP – строковое имя объекта (точки на плоскости: «Точка1» и т.п.) Конструктор по умолчанию. Инициализирует переменные значением 0 и объявляет особую точку «Начало координат» Перегруженный конструктор: инициализирует переменные класса заданными значениями s.valueOf(…) переводит числовой параметр в строковое выражение.

13 Методы Java double distance(int x, int y) { int dx = this.x - x; int dy = this.y - y; return Math.sqrt(dx*dx + dy*dy); } double distance(Point p) { return distance(p.x, p.y); } void prCoord() { System.out.println("Координаты точки:"); System.out.println(this.nameP + " x = " + this.x + ", y = " + this.y); } void prDist(Point p) { System.out.println ("Расстояние между : " + this.nameP + " и " + p.nameP + " ---> " + this.distance(p)); } }// Класс Point закрыт Метод вычисляет расстояние по заданным координатам через переменные класса Перегруженный метод вычисляет расстояние по заданным координатам через экземпляр класса, используя вызов первого варианта метода Метод печатает имя и координаты точки на плоскости. Метод вычисляет и печатает расстояние между объектом, к которому он применяется (this) и объектом, переданным в него в качестве параметра p.

14 Методы Java class PointDist { public static void main(String args[]) { Point p0 = new Point(); // Используем конструктор по умолчанию Point p1 = new Point(30, 40); // Используем другой конструктор Point p2 = new Point(0, 0); // Используем другой конструктор Point p3 = new Point(50, 60); // Используем другой конструктор p0.prCoord(); p1.prCoord(); p2.prCoord(); p3.prCoord(); p0.prDist(p1); p0.prDist(p2); p0.prDist(p3); p1.prDist(p3); }

15 Методы Java