Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Методы класса. Работа с массивами и строками Java. основы объективно-ориентированного программирования в java

Цели работы: 1. Получить знания о простейших конструкциях языка Java – функциях, масси­вах, строках.

2. Закрепить знания о свойствах и способах использования рекурсивных функций.

3. Получить знания о классах и объектах языка Java и возможностях их использования.

Задание по практическому занятию

Разработка алгоритма и программы для организации вычислений с использованием рекурсивных функций.

Ввод, отладка и выполнение разработанной программы.

Методические указания

2.1. В классе ПЭВМ студенты самостоятельно под руководством преподавателя выполняют п. 3 настоящего задания.

2.2. При отладке программы рекомендуется организовать вывод промежуточных данных для контроля правильности работы подпрограмм.

2.3. Текст отлаженной программы необходимо сохранить на сменный носитель и отразить в отчете на ЛР.

Выполнение работы

Разработка алгоритма и программы

Понятия функции и метода

Функция — часть программы, имеющая собственное имя. Это имя можно использовать в программе как команду (такая команда называется вызовом функции). При вызове функции выполняются команды, из которых она состо­ит. Вызов функции может возвращать значение (аналогично операции) и поэтому может использоваться в выражении наряду с операциями.

Функции используются в программировании, чтобы уменьшить его слож­ность:

§ Вместо того чтобы писать непрерывную последовательность команд, в которой вскоре перестаешь ориентироваться, программу разбивают на под­программы, каждая из которых решает небольшую законченную задачу, а по­том большая программа составляется из этих подпрограмм (этот прием назы­вается декомпозицией).

§ Уменьшается общее количество кода, потому что, как правило, одна функция используется в программе несколько раз.

§ Написанная однажды и всесторонне проверенная функция, может быть включена в библиотеку функций и использоваться в других программах (при этом не надо вспоминать, как была запрограммирована эта функция, доста­точно знать, что она делает). Существует множество полезных библиотек функций, которыми могут пользоваться все программисты, а некоторые биб­лиотеки поставляются «в комплекте» с языком программирования (например, все, кто программировал на Паскале, пользовались библиотечной функци­ей writeln() для вывода на экран, а в Java для этих целей доступен ме­тод System.out.println(), входящий в одну из стандартных библиотек).

Метод — это функция, являющаяся частью некоторого класса, которая может выполнять операции над данными этого класса. В языке Java вся программа состоит только из классов и функции могут описываться только внутри них. Именно поэтому все функции в языке Java являются методами.

Суть понятия метод рассматривается в следующей работе. А пока мы мо­жем использовать его как синоним знакомого (по другим языкам програм­мирования) понятия функция.

Объявление метода

Для того чтобы использовать в программе собственный метод, его необходи­мо объявить.

При объявлении метода необходимо указать тип значения, которое будет воз­вращено после выполнения метода в программу. Если значение возвращать не нужно, указывается ключевое слово void. Затем идет произвольный идентификатор — имя метода. После имени метода в круглых скобках указы­вается список параметров (может быть пустым), а затем — в фигурных скоб­ках — команды, составляющие тело метода.

Параметры — это данные, которые нужны методу для работы. Например, метод, рисующий круг, должен получить радиус и координаты центра круга. (Можно, конечно, было бы разработать метод без параметров, который рисует круг единичного радиуса с центром в начале координат, но он был бы значи­тельно менее полезен).

Описание каждого параметра аналогично объявлению переменной (тип, а за­тем идентификатор — имя параметра). Параметры перечисляются через запя­тую.

В теле метода, возвращающего значение, должна быть команда return, после которой через пробел указывается выражение соответствующего типа. Эта команда заканчивает работу метода и передает указанное выражение в каче­стве возвращаемого значения основной программе — в то место, откуда ме­тод был вызван*.

В качестве примера создадим метод для вычисления суммы квадратов двух целых чисел. Как и в случае с программой, важно в первую очередь опреде­лить входные и выходные данные. Входные данные — это параметры метода. Выходные данные — это его возвращаемое значение.

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

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

Простейший вариант метода будет выглядеть следующим образом:

long squareSum(int x, int y) {return x*x + y*y;}

Перед возвращаемым типом указывается одно или несколько ключевых слов модификаторов (которые будут изучены позднее). Нам необходимо добавить к объявлению метода squareSum() модификатор static, поскольку мы собира­емся обращаться к нему из метода main(), имеющего такой модификатор.

Описание метода squareSum() должно находиться внутри того единственного класса, из которого состоит наша простая программа, но не внутри мето­да main(), а на одном уровне с ним. Тоесть:

package mainPack;

public class MyClass {

/*** @param args*/

public static void main(String[] args) {}

static long squareSum(int x, int y) {return x*x + y*y;}}

В результате в классе MyClass теперь два метода, один из которых, main(), вы­полняется при старте программы. Чтобы выполнился второй метод, его необ­ходимо вызвать.

Вызов метода

Чтобы вызвать метод из другого метода того же класса, необходимо указать его имя, а затем в скобках список фактических параметров (если метод не требует параметров, скобки все равно ставятся).

Например, мы можем обратиться к описанному нами методу squareSum(), передав ему в качестве параметров два целых числа 10 и 20 следующим об­разом:

System.out.println(squearSum(10,20)+1);

В консоль будет выведено число 501.

Обратите внимание, вызов метода используется как операция, которую мож­но комбинировать с другими операциями (в данном случае, суммой) в выра­жении.

Чтобы вызвать метод другого класса, необходимо иметь объект этого класса*. Имя метода указывается через точку после имени объекта.

Например, в классе String (строка) имеется метод length(), возвращаю­щий длину строки. Обратиться к этому методу можно только через объект класса String (что вполне логично, метод вызывается для той строки, длину которой мы хотим узнать).

String S = "Привет"; // Создание объекта класса String, подробнее см. ниже

int x = S.length(); // Вызов метода length() для объекта S.В результате x = 6

Подробнее о вызове методов других классов будет рассказано позже.

В дальнейшем, рассказывая о каких-либо методах, мы будем называть их не только именем, но и для наглядности указывать в скобках параметры метода, например сharAt(int i). В результате становится легко объяснить назна­чение метода: «Метод charAt(int i) возвращает символ строки с индек­сом i». Тип возвращаемого значения мы будем указывать только при необхо­димости.

3.1.2 Пример 1 использования методов. Поиск минимального элемента и сорти­ровка массива:

// классдляобработкиобщегомассиваразнымиметодами вариант1

publicclasssamoilovaarray {

// выделяемпамятьподмассив

staticshort[] myarray = newshort[10];

// методыклассаarraysamoilova

publicstaticvoid main(String[] args) {

// обращаемся к методамклассаarraysamoilova

iniarray();

printarr();

System.out.print("\nМинимальный элемент: "+ minX());

sort();

System.out.print("\n Рассортировали ");

printarr();

}

//методинициализациимассива

publicstaticvoid iniarray(){

for (int i=0;i<10;i++){

myarray[i]=(short)Math.round(50*Math.random());

}}

//методпоискаминимума в массиве

publicstaticshort minX(){

short x=0;

x=myarray[0];

for(int i=1;i<10;i++){

if(x>myarray[i]){

x=myarray[i];

}}return x;

}

//методсортировкимассива

publicstaticvoid sort(){

short temp;

for(int i=0;i<9;i++){

for(int j=9;j>i;j--){

if(myarray[j-1]>myarray[j]){

temp=myarray[j];

myarray[j]=myarray[j-1];

myarray[j-1]=temp;

}}}}

//методвыводамассива

publicstaticvoid printarr(){

System.out.print("\nМассив: ");

for(int i=0;i<=9;i++){

System.out.print(myarray[i]+", ");

}}

 

}

 

В данной программе кроме главного метода main используются четыре метода — iniarray(), minX(), sort() и printarr(), использующие объявленный массив, для которого выде­ляется память на десять элементов. Происходит инициализация (за­полнение) массива случайными числами с помощью метода Math.random(). Явным преобразованием (short) приводим полученные значения типа double к значениям типа short. После того, как массив инициализирован, можно производить над ними различные действия. Метод minX() ищет минимальный элемент в полученном массиве. Второй метод производит сортировку полученного мас­сива методом пузырька. Затем выводятся значения его элементов. Поскольку метод minX() возвращает значе­ние строкового типа, его можно использовать в качестве аргумента конструк­ции System.out.print().

Далее приводится второй вариант решения для примера 1, здесь в методе main() создается экземпляр класса и вызываются все его методы.

 

// классдляобработкиобщегомассиваразнымиметодами вариант2

publicclass arraysamoilova {

// выделяемпамятьподмассив - этоданные (свойства) классаarraysamoilova

publicshort[] myarray = newshort[10];//10 элементов

// методыклассаarraysamoilova

publicstaticvoid main(String[] args) {

 

//создаемэкземпляркласса - arr

arraysamoilova arr = new arraysamoilova();

// обращаемсякметодамклассаarraysamoilova

arr.iniarray();

arr.printarr();

System.out.print("\nМинимальныйэлемент: "+ arr.minX());

arr.sort();

System.out.print("\n Рассортировали ");

arr.printarr();

}

//методинициализациимассива

publicvoid iniarray(){

for (int i=0;i<10;i++){

myarray[i]=(short)Math.round(50*Math.random());

}}

//методпоискаминимума в массиве

publicshort minX(){

short x=0;

x=myarray[0];

for(int i=1;i<10;i++){

if(x>myarray[i]){

x=myarray[i];

}}return x;

}

//методсортировкимассива

publicvoid sort(){

short temp;

for(int i=0;i<9;i++){

for(int j=9;j>i;j--){

if(myarray[j-1]>myarray[j]){

temp=myarray[j];

myarray[j]=myarray[j-1];

myarray[j-1]=temp;

}}}}

//методвыводамассива

publicvoid printarr(){

System.out.print("\nМассив: ");

for(int i=0;i<=9;i++){

System.out.print(myarray[i]+", ");

}}

 

}

Отладьте оба варианта программ и убедитесь в идентичности результатов.

Задание 1

Создайте в пакете данной лабораторной работы класс и отладьте приведенный выше пример. Добавьте в этот класс два новых метода:

  • умножение всех элементов массива на 3;
  • подсчет числа четных элементов.

 

Задание 2

Напишите метод toUSD(int rur, double course), переводящий рубли в доллары по заданному курсу. Вызовите его дважды в методеmain() c любы­ми параметрами, результат выведите в консоль.

Массивы

Определения

Массив — это совокупность переменных одного типа, имеющих общее имя. Каждая такая переменная называется элементом массива. С каждым элемен­том связано целое число — индекс, который используется (вместе с именем массива) для обращения к нему.

Создание массива

Создание массива происходит в два этапа.

1. Объявление массива. На этом этапе создается переменная типа ссылка на массив, с помощью которой мы сможем потом к массиву обращаться. Для этого указывается тип элементов массива, затем квадратные скобки (они по­казывают, что мы имеем дело с массивом, а не с обычным типом данных) и идентификатор — имя массива. Идентификаторов может быть несколько (как и в случае с переменными простых типов).

Примеры:

int[] a; // Создается ссылка на массив типа int

double[] b, c; // Создаются две ссылки на массивы типа double

2. Создание массива. Создать массив — значит выделить в памяти место, до­статочное для хранения всех его элементов. Для этого надо указать длину массива — количество элементов в нем. Кроме того, переменная-ссылка, объ­явленая на предыдущем этапе, теперь будет «указывать» не в пустоту (в Java эта «пустота» называется null), а на конкретный массив, с элементами кото­рого можно работать.

Массив создается операцией new, которая выделяет участок памяти и возвра­щает указатель на этот участок. После ключевого слова new должен быть ука­зан тип данных массива и его длина в квадратных скобках:

a = new int[5]; // В памяти выделяется место под массив из пяти целочисленных элементов, переменная a будет указывать на этот массив

b = new double[4]; // В памяти выделяется место под массив из четырех дей­ствительных элементов, на него указывает переменная b

При этом элементам массива присваиваются значения по умолчанию. Мож­но сразу проинициализировать массив нужными значениями, если перечис­лить их через запятую в фигурных скобках (длина массива при этом не указы­вается):

c = new double[]{2.3, 1.02, 8}; // В памяти выделяется место под массив из трех действительных элементов, на него указывает переменная с, элементы мас­сива сразу получают нужные значения.

Примеры инициализации строковых массивов:

String[] goods = new String[] {"Колбаса", "Сосиски", "Баранки", "Молоко", "Торт", "Яблоки", "Шоколад"}; // В памяти выделяется место под массив из семи строковых элементов, на него указывает переменная goods, элементы массива сразу получают нужные значения.

String[] gamers = {"Павел","Михаил","Евгений","Ирина", "Ольга","Виктор", "Игорь","Дарья","Иван"};// В памяти выделяется место под массив из девяти строковых элементов, на него указывает переменная gamers, элементы массива сразу получают нужные значения.

 

Работа с массивом

После объявления массива с ним можно работать. Например, присваивать значения элементам массива и вообще обращаться с ними как с обычными переменными. Для обращения к конкретному элементу необходимо указать имя переменной, указывающей на массив, и его индекс в квадратных скобках. Нумерация элементов массива начинается с нуля.

Примеры:

a[0] = 5; // Первому элементу массива a, присваивается значение 5

a[3] = 17; // Четвертому элементу массива a, присваивается значение 17

a[1] = a[0] – a[3]; // Второму элементу массива a присваивается значение -12

Длину массива можно определить, используя запись:

идентификатор_массива.length

Например, a.length будет равняться 5.

Очень удобно перебирать все элементы массива в цикле типа for. При этом обычно используется следующая форма:

for (int i = 0; i < a.length; i++) {// здесь можно что-нибудь сделать с эле­ментом a[i]}

Например, следующий код присваивает всем элементам массива b числа от 1 до 4 (поскольку в массиве b четыре элемента):

for (int i = 0; i < b.length; i++) {b[i] = i;}

За границы массива выходить нельзя. Т.е., если в массиве a пять элементов, то обращение к шестому или восьмому элементу приведет к ошибке (точнее, возбуждению исключения).

a[5] = 8; // Нельзя, в массиве a только 5 элементов: a[0], a[1], a[2], a[3], a[4]

Задание 3

Напишите метод, увеличивающий элементы массива на 10%.

Подсказка: подумайте, какие у этого метода входные и выходные данные. Ре­шите сами, должен ли метод изменять исходный массив, или в результате ра­боты будет создаваться новый. Напишите к методу комментарии.

Работа со строками

Создание строк

Строки тоже являются переменными ссылочного типа, а точнее — ссылками на объекты одного из нескольких строковых классов Java. Мы рассмотрим класс String.

Самый распространенный способ создать строку — это организовать ссылку типа String на строку-константу:

String s = "Это строка";

Можно просто сначала объявить переменную (которая получит значе­ние null), а потом заставить ее ссылаться на строку-константу, другую строку или воспользоваться командой new, чтобы явным образом выделить память для строки:

String s1, s2, s3; // Объявление трех переменных, которые пока не связаны ни с какой строкой

s1 = "Да здравствует день танкиста"; // Переменная s1 теперь ссылается на об­ласть памяти, в которой хранится строка "Да здравствует день танкиста"

s2 = s1; // Теперь обе переменные s1 и s2 ссылаются на одно и то же место па­мяти

s3 = new String(); // s3 ссылается на место в памяти, где хранится пустая строка

Класс String содержит следующие методы для работы со строками:

String concat(String s) или “+” – слияниестрок;

boolean equals(Object ob) и equalsIgnoreCase(String s) – сравнение строк с учетом и без учета регистра соответственно;

int compareTo(String s) и compareToIgnoreCase(String s) – лексикографическое сравнение строк с учетом и без учета регистра. Метод осуществляет вычитание кодов символов вызывающей и передаваемой в метод строк и возвращает целое значение. Метод возвращает значение нуль в случае, когда equals() возвращает значение true;

boolean contentEquals(StringBuffer ob) – сравнение строки и содержимого объекта типа StringBuffer;

String substring(int n, int m) – извлечение из строки подстроки длины (m-n), начиная с позиции n. Нумерация символов в строке начинается с нуля;

String substring(int n) – извлечение из строки подстроки, начиная с позиции n;

int length() – определение длины строки;

int indexOf(char ch) – определение позиции символа в строке;

static String valueOf(значение) – преобразование переменной базового типа к строке;

String toUpperCase()/toLowerCase() – преобразование всех символов вызывающей строки в верхний/нижний регистр;

String replace(char с1, char с2) – замена в строке всех вхождений первого символа вторым символом;

String intern() – заносит строку в “пул” литералов и возвращает ее объектную ссылку;

String trim() – удаление всех пробелов в начале и конце строки;

char charAt(int position) – возвращение символа из указанной позиции (нумерация с нуля);

boolean isEmpty() – возвращает true, если длина строки равна 0;

byte[] getBytes(), getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) – извлечение символов строки в массив байт или символов;

static String format(String format, Object... args), format(Locale l, String format, Object... args) – генерирует форматированную строку, полученную с использованием формата, интернационализации и др.;

String[] split(String regex), split(String regex, int limit) – поиск вхождения в строку заданного регулярного выражения (разделителя) и деление исходной строки в соответствии с этим на массив строк. Метод split(String regExp) разбивает текст на слова, используя в качестве разделителя символ (прбел, ?!,.: и т.п.), входящий в параметр regExp, и возвращает ссылку на массив, составленный из этих слов.

Во всех случаях вызова методов, изменяющих строку, создается новый объект типа String.

В следующем примере спользуются методы работы со строками.

 

publicclass stringsamoilova {

staticinti;

 

publicstaticvoid main(String[] args) {

primer1();

}

publicstaticvoid primer1(){

String str1 = "В траве сидел кузнечик";

i = str1.length();

String str2 = " совсемкакогуречик.";

str2 = str1.concat(str2);

str2 = str2.toUpperCase();

System.out.println(str2);

str2 = str2.replace("ЧИК", "Ц");

System.out.println(str2);

str1 = str2.substring(8, 22).toLowerCase();

System.out.println(str1);

//разбивает строку на слова, разделитель - пробел

String[] arr = str2.split(" ");

for (String ss : arr)

System.out.println(ss);

}

}

Отладьте данный пример, заменив строки произвольным текстом.

Задание 4

Напишите метод, заменяющий в строке все вхождения слова «бяка» на «вы­резано цензурой».

Заголовок метода main()

Теперь мы можем, наконец, понять большую часть описания мето­да main() (за исключением ключевых слов public и static.

Заголовок public static void main(String[] args) означает, что ме­тод main() не возвращает значения (и действительно, мы ни разу не исполь­зовали в его теле команду return), а в качестве единственного параметра при­нимает массив строк args.

В качестве параметра args методу main() передаются так называемые аргу­менты командной строки. Дело в том, что каждую программу можно запу­стить не просто щелкнув мышкой по ее значку. Можно ввести имя исполняе­мого файла программы в командной строке (нажмите комбина­цию Windows + R, чтобы увидеть командную строку Windows, если вы рабо­таете в этой операционной системе), а после имени через пробел указать один или несколько дополнительных параметров (аргументов командной строки).

Таким образом, в методе main() можно обратиться к элементам масси­ва args и увидеть, какие дополнительные аргументы пользователь указал при запуске программу. Можно научить программу на некоторые из этих ар­гументов реагировать.

При этом необязательно запускать программу из командной строки. В диало­говом окне Run --> Run... есть вкладка(x) = Arguments, перейдя на которую, можно перечислить интересующие вас аргументы командной строки и в зави­симости от них протестировать реакцию программу. Если, конечно, это необ­ходимо: большинство программ никак не реагирует на аргументы командной строки.

Задание 5

Написать метод для подсчета суммы выигрыша на тотализаторе. В качестве параметра метод принимает имя выигравшей забег лошади. Перечень ставок задан с помощью трех массивов равной длины. Первый массив — имя игро­ка, второй — кличка лошади, на которую он поставил и третий — сумма, ко­торую игрок поставил на эту лошадь (то есть, игрок gamers[i] поставил на ло­шадь horses[i] сумму sums[i]). Метод должен возвращать массив строк, где каждая строка содержит имя игрока-победителя и выигранную им сумму.

Решение

publicstaticvoid total(String firstHors){

String[] gamer = {"Павел","Михаил","Евгений","Ирина",

"Ольга","Виктор", "Игорь","Дарья","Иван"};

String[] horses = {"Амур","Ветер","Амур","Ве­тер","Амур","Фараон",

"Ветер","Амур","Ветер"};

int[] sums = {2000,5000,2600,8000,6000,2600,7700,6000,3550};

System.out.print("\nПобедилалошадь :" + firstHors +"\n");

System.out.print("\nВыгралиигроки:\n");

for (int i = 0;i<9;i++){

if(horses[i] == firstHors){

System.out.print(gamer[i]+"\t\t"+sums[i]+"рублей\n");}

}

}

 

Обратитесь к методу. Проведите отладку для разных лошадей – победителей.

Примерный вид консоли:

Победила лошадь:Ветер

 

Выграли игроки:

Михаил 5000рублей

Ирина 8000рублей

Игорь 7700рублей

Иван 3550рублей

Задание 6 (индивидуальное). Написать метод для обработки массива в соот­ветствии с вашим вариантом.

1.Дан случайный массив, состоящий из 100 целых чисел из диапазона [1,20]. Вывести все числа, которые встречаются в этом массиве несколько раз.

2.Найти сумму элементов массива, кратных заданному числу.

3.Найти количество положительных и отрицательных элементов массива.

4.Найти номер последнего отрицательного элемента в массиве.

5.Определить, сколько элементов массива превосходят по модулю задан­ное число А.

6.Определить, есть ли в данном массиве элемент, равный заданному чис­лу. Если есть, то вывести номер одного из них.

7.Найти число элементов массива, которые больше своих «соседей», т. е. предшествующего и последующего элементов.

8.Все элементы массива с нечетными индексами разделить нацело на пер­вый элемент.

9.Дан случайный массив целых чисел. Выяснить, верно ли, что сумма эле­ментов массива есть четное число.

10. Дан случайный массив целых чисел. Выяснить, какое число встречается раньше - положительное или отрицательное.

11. Дан случайный массив целых чисел. Поменять местами наибольший и наименьший элементы.

12.Дан случайный массив целых чисел. Не используя других массивов, пере­ставить его элементы в обратном порядке.

 

Работа с датой и временем

Данные типа дата/время приходится обрабатывать довольно часто, поэтому все современные языки программирования предлагают удобный механизм для работы с ними в одной из своих библиотек.

В Java для этих целей разработаны классы Date и Calendar, собранные в пакете java.util.

Класс Date хранит число миллисекунд, прошедших с 1 января 1970 года (во внутреннем поле, имеющем тип long). Конструктор без параметров этого класса создает объект, содержащий текущее время (по системным часам ма­шины, на которой выполняется программа). Другой конструктор, с парамет­ром типа long, создает объект Date на основе заданного числа.

Метод getTime() позволяет получить это число, а метод setTime(long newTime) — изменить.

Для отображения даты на экране ее внутреннее представление необходимо перевести в строку, более удобную для восприятия. Для этого обычно исполь­зуется класс SimpleDateFormat (являющийся наследником абстрактного классаDateFormat), который надо импортировать из пакета java.text. Преж­де всего необходимо создать объект этого класса, указав в качестве параметра конструктора строку, определяющую способ форматирования. Например:

SimpleDateFormat formatter = new SimpleDateFormat("dd.M­M.yyyy hh:mm");

Теперь следует вызвать метод format() созданного форматирующего объекта, передав ему в качестве параметра тот объект Date, который мы хо­тим представить в виде строки. Чтобы вывести на экран текущую дату, ис­пользуем команду:

System.out.println(formatter.format(new Date()));

В момент написания этих строк программа вывела в консоль

23.09.2007 05:51

В строке "dd.MM.yyyy hh:mm" dd означает цифры дня, MM — цифры меся­ца, yyyy — цифры года, hh — часы и mm — минуты. Комбинация MMMM дала бы название месяца (в именительном падеже), а yy — только две последние цифры года. Названные составляющие могут следовать в любом порядке (причем, все они присутствовать не обязаны), а разделители между ними (в примере это точка, пробел и двоеточие) могут быть и другими.

Класс Calendar позволяет работать с датой на более высоком уровне, отдельно рассматривая составляющие даты (число, месяц, год и т.д.). Он яв­ляется абстрактным, поэтому необходимо пользоваться одним из его наслед­ников. Таковым является GregorianCalendar (описывающий грегори­анский календарь, по которому мы живем).

Создать объект этого класса, содержащий текущую дату/время можно конструктором без параметров. Всего же у клас­саGregorianCalendar семь конструкторов, наиболее мощный из них при­нимает шесть параметров:

GregorianCalendar(int year, int month, int day, int hour, int min­utes, int seconds)

Получить любую часть даты можно с помощью универсального мето­да get(int field). Целочисленный параметр fieldопределяет желае­мую часть даты.

В классе Calendar определены константы, описывающие возможные вари­анты: ERA, YEAR, MONTH, WEEK_OF_YEAR, WEEK_OF_MONTH, DAY_OF_YEAR, DAY_OF_MONTH, DAY_OF_WEEK, HOUR_OF_DAY, MINUTE, SECOND, MILLISECONDи несколько других.

Например, узнаем, какой сегодня день года:

GregorianCalendar today = new GregorianCalendar();int re­sult = today.get(Calendar.DAY_OF_YEAR);System.out­.println(result);

Любую часть даты можно изменить методом set(int field, int value).

Задание 6 (дополнительное*)

Спроектируйте и разработайте метод, определяющий, сколько времени про­шло с заданной даты. С помощью этого методы выведите в консоль, сколько времи прошло с вашего дня рождения в удобном для восприятия виде, напри­мер: «Вам исполнилось 20 лет, 3 месяца, 18 дней, 4 часа, 5 минут и 10 се­кунд».

 

3.2. Основы объектно-ориентированного программирования в Java

Классы и объекты

Java — полностью объектно-ориентированный язык, поэтому все действия, выполняемые программой, находятся в методах тех или иных классов.

Описание класса начинается с ключевого слова class, после которого указывается идентификатор — имя класса. Затем в фигурных скобках перечисляются атрибуты и методы класса. Атрибуты в языке Java называются полями. Поля и методы называются членами класса. Поля описываются как обычные переменные.

Правила записи методов рассматривались в предыдущей лабораторной работе.

Опишем для примера класс Dog (собака). У него будет два поля: кличка и возраст. При описании поведения собаки в этом простом примере ограничимся лаем (метод класса). Конечно, лаять по-настоящему наша собака не будет, она будет выводить в консоль «гав-гав». Чтобы было интереснее, предположим, что все собаки, с которыми имеет дело наша программа, умны настолько, что когда их вынуждают лаять, они говорят «гав-гав» столько раз, сколько им лет.

Заметим, что в программе уже должен быть один класс (тот, в котором описан метод main()). Поскольку этот класс к собакам отношения не имеет, описывать новый класс Dog следует за его пределами.

 

public class Dog {

public int age;// возраст

public String name; // кличка

public void voice() {

for(int i = 1; i <= age; i++){

System.out.println(name + " " + i +" -й раз гав-гав");

}

System.out.println();

}

 

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

Полямикласса должны быть данные, относящиеся к этому понятию. Для собаки это возраст, кличка, порода и т.д., а для сессии — дата начала, продолжительность, курс и т.д.

Методы класса, как правило, работают с данными этого класса. Например, метод voice() в нашем примере обращается к полю age (возраст).

Когда какой-то класс описан, могут создаваться объекты этого класса и с ними можно работать, вызывая их методы (кормить собаку, выгуливать, просить ее лаять — словом делать все то, что позволяет поведение класса, т.е. совокупность его методов).

Для обращения к объектам удобно использовать переменные, имеющие тип класса. Например, для работы с собаками опишем переменную типа Dog:

Dog mydog;

Имя переменной лучше давать по названию класса, чтобы в процессе разбора кода кем-то отличным от вас, или вами же, но много позже, не представляли большой сложности распознать, что же происходит.

Переменная типа класса является ссылочной переменной, она не хранит данные (как переменные простых типов int, charи т.д.), а указывает на место в памяти, где эти данные хранятся (как переменные типа массива). Данными, на которые указывает только что описанная переменная dog, может быть объект класса Dog. Его необходимо предварительно создать командой new:

mydog = new Dog();

Можно объявить и создать одним оператором:

Dogmydog=newDog();

Теперь переменная mydog указывает на некий объект класса Dog, хранящий в памяти свои данные (возраст и кличку). Кроме того, эту собаку можно заставить лаять, вызвав соответствующий метод командой:

mydog.voice();

Для того, чтобы обратиться к члену класса, необходимо указать его имя после имени объекта через точку.

Обратите внимание, «залаяла» именно та собака, на которую «указывала» переменная mydog. Если в программе были созданы другие собаки, они будут молчать до тех пор, пока не будет вызван их метод voice().

Таким образом, когда данные (поля) и команды (методы) описываются в одном классе, они оказываются тесно связаны друг с другом в объектах этого класса. Метод вызывается не сам по себе, а для конкретного объекта и работает с полями именно этого объекта.

Задание 1.

В Java – проекте создайте в общем пакете два класса – один класс, содержащий метод main(), другой – класс Dog, приведенный выше.

Из метода main() обратитесь к классу Dog со своими значениями, примерно вот так:

 

public class MyClasses {

public static void main(String[] args) {

// создаем два экземпляра класса Dog

Dog dog1 = new Dog(); Dog dog2 = new Dog();

dog1.name = "Тузик"; dog1.age = 6;

dog2.name = "Жучка"; dog2.age = 4;

dog1.voice();//лаитТузик

dog2.voice();//лаитЖучка

}

}

 

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

Тузик 1 -й раз гав-гав

Тузик 2 -й раз гав-гав

Тузик 3 -й раз гав-гав

Тузик 4 -й раз гав-гав

Тузик 5 -й раз гав-гав

Тузик 6 -й раз гав-гав

 

Жучка 1 -й раз гав-гав

Жучка 2 -й раз гав-гав

Жучка 3 -й раз гав-гав

Жучка 4 -й раз гав-гав

Конструкторы классов

Конструктор — это особенный метод класса, который вызывается автоматически в момент создания объектов этого класса. Имя конструктора совпадает с именем класса.

Например, в классе Dog может быть конструктор с двумя параметрами, который при создании новой собаки позволяет сразу задать ее кличку и возраст.

public Dog(String n, int a) {name = n; age = a;}

Конструктор вызывается после ключевого слова new в момент создания объекта. Теперь, когда у нас есть такой конструктор, мы можем им воспользоваться:

Dog tuzik = new Dog("Тузик", 2);

В результате переменнаяtuzikбудет указывать на «собаку» по кличке Тузик, имеющую возраст 2 года. Кстати, этот возраст можно узнать, заставив собаку лаять командой

tuzik.voice();

Конструкторы добавляются в класс, если в момент создания объекта нужно выполнить какие-то действия (начальную настройку) с его данными (полями). Сразу задать кличку и возраст собаки более естественно, чем каждый раз порождать безымянного щенка, а затем давать ему имя и быстро выращивать до нужного возраста. Хотя до появления ООП программисты часто делали именно так.

Модификаторы видимости

Доступ к любому члену класса — полю или методу — может быть ограничен. Для этого перед его объявлением ставится ключевое слово private. Оно означает, что к этому члену класса нельзя будет обратиться из методов других классов.

Ключевое слово public может употребляться в тех же случаях, но имеет противоположный смысл. Оно означает, что данный член класса является доступным. Если это поле, его можно использовать в выражениях или изменять при помощи присваивания, а если метод, его можно вызывать.

Ключевое слово protected означает, что доступ к полю или методу имеет сам класс и все его потомки.

Если при объявлении члена класса не указан ни один из перечисленных модификаторов, используется модификатор по умолчанию (default). Он означает, что доступ к члену класса имеют все классы, объявленные в том же пакете.

Создадим новый классSecondDog(новый файл в том же пакете) следующим образом:

 

public class SecondDog {

private int age;// возраст

privateStringname; // кличка

// конструктор с двумя параметрами

public SecondDog (String n, int a){name = n; age = a;}

public void voice(){

for(int i = 1; i <= age; i++)

{System.out.println(name + " " + i +" -й раз гав-гав");}

System.out.println();

}

}

 

Поля age и name окажутсяскрытыми. Это значит, что мы не можем изменять их (

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...