русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Расширение класса


Дата добавления: 2015-06-12; просмотров: 717; Нарушение авторских прав


 

Цель лабораторной работы: получить навыки по расширению существующих классов (реализация принципа наследования объектно-ориентированного программирования).

Задание: создать класс путем расширения класса, созданного в предыдущей лабораторной работе. В расширенный класс добавить не менее четырех полей различного типа. Основные результаты работы методов оформить в виде вывода в консоль и в текстовый файл.

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

class имя_класса extends имя_суперкласса {

type переменная1_объекта:

type переменная2_объекта:

type переменнаяN_объекта:

type имяметода1(список_параметров) {

тело метода;

}

type имяметода2(список_параметров) {

тело метода;

}

type имя методаМ(список_параметров) {

тело метода;

}

}

 

Для полноты ощущений будем создавать новый класс в новом файле. Наиболее часто встречающаяся и неочевидная ошибка – это попытка просто расширить класс в его описании. Например, имеем следующий образец кода:

public classParent {

publicParent(String str){

}

}

public classChild extendsParent{

publicChild(String str){

}
}

для класса Child происходит ошибка компиляции:

Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor.

То есть, если мы попытаемся создать новый класс следующим образом:

public class tube_ext extends tube {

String filename;

File f0;

tube_ext(int size, int weight, String name, boolean cap_on, String filename) {

………,

то получим ошибку компиляции. Решение может быть выполнено двумя способами:



1.

public classParent {
publicParent(String str){
}
}
public classChild extendsParent{
publicChild(String str){
super(str);
.....
}
}

2.

public classParent {
publicParent() {
}
publicParent(String str){
}
}
public classChild extendsParent{
publicChild(String str){
}
}

Таким образом, в нашем случае описание вновь создаваемого класса необходимо дополнить вызовом конструктора суперкласса. Это сделано с помощью ключевого слова super. Обратите внимание, что определять нужно только новые свойства, расширяющие старый класс.

В конструкторе сразу же инициализируем и создадим пустой файл, соответствующий нашему расширенному тюбику. Файловый ввод-вывод осуществляется с помощью конструкции try – catch. Для корректной работы с объектами ввода-вывода нужно в начале описания импортировать стандартный класс ввода-вывода (import java.io.*;). Запись в файл будем производить с помощью объекта BufferedWriter (количество скобок не совпадает, поскольку описание класса не окончено):

 

import java.io.*;

public class tube_ext extends tube{

File f0;

String filename;

tube_ext(int size, int weight, String name, boolean cap_on, String filename){

super(size, weight, name, cap_on);

this.filename=filename;

 

try{

File f0 = new File(filename);

// Create file if it does not exist

boolean success = f0.createNewFile();

if (success) {

// File did not exist and was created

} else {

 

// File already exists

}

} catch (IOException e) {

}

try {

BufferedWriter out = new BufferedWriter(new FileWriter(filename, true));

out.write("Size="+ size + ", "+"weight=" + weight +", "+"name="+name+", "+"cap_on="+cap_on+" " + filename + '\n');

out.close();

} catch (IOException e) {

}

 

}

 

Далее рекомендована работа по следующему шаблону. Поскольку методы будут отличаться от описанных в классе-предке только записью данных в текстовый файл, то намного проще будет вызывать методы класса-предка с помощью ключевого слова super. Таким образом, каждый метод будет содержать оператор super, а также операции сохранения в текстовый файл значений полей тюбика с необходимыми комментариями. Единственный метод, для которого придется сделать исключение – метод надавливания на тюбик, поскольку мы добавим в него описание «отпускания».

 

Метод открытия тюбика:

void tube_ext_open (String name, boolean cap_on, String filename){

super.tube_open(name, cap_on);

try {

BufferedWriter out = new BufferedWriter(new FileWriter(filename, true));

out.write("Tube is opened" + '\n');

out.write("cap_on = "+this.cap_on + '\n');

out.close();

} catch (IOException e) {

}

}

 

Метод, описывающий нажатие на тюбик:

void tube_ext_pressed (int size, int weight, String name, String filename){

 

weight-=10;

this.weight=weight;

size-=20;

System.out.println("You pressed the tube "+name+", weight="+weight+", size="+size);

 

 

try {

BufferedWriter out = new BufferedWriter(new FileWriter(filename, true));

out.write("Tube is pressed" + '\n');

out.write("Name = " + name + ", size = " + size + ", weight = "+ this.weight + '\n');

size+=20;

out.write("Tube is released" + '\n');

out.write("Name = " + name + ", size = " + size + ", weight = "+ this.weight + '\n');

out.close();

} catch (IOException e) {

}

 

System.out.println("You released the tube "+name+", weight="+this.weight+", size="+size);

 

if (this.weight<=0){

System.out.println("Weight= "+this.weight + "! EMPTY!!!");

 

try {

BufferedWriter out = new BufferedWriter(new FileWriter(filename, true));

out.write("Tube is EMPTY!!!" + '\n');

out.close();

} catch (IOException e) {

}

}

 

 

}

 

 

В методе закрытия тюбика ради разнообразия используем для записи в файл класс RandomAccessFile:

 

void tube_ext_closed(String name, boolean cap_on, String filename ){

super.tube_closed(cap_on, weight, size, name);

try {

File f = new File(filename);

RandomAccessFile raf = new RandomAccessFile(f, "rw");

// Seek to end of file

raf.seek(f.length());

 

// Append to the end

 

raf.writeChars("You've closed the tube " + name +", cap_on="+this.cap_on +"size="+size+" weight="+this.weight);

raf.close();

} catch (IOException e) {

}

}

 

Описание класса окончено. Теперь заходим в наш класс, содержащий метод main. Необходимо создать экземпляр класса нашего расширенного класса тюбика:

tube_ext zhemchug = new tube_ext (70, 120, "zhemchug",true,"zhemchug.txt")

По очереди вызываем методы нашего расширенного класса:

 

zhemchug.tube_ext_open(zhemchug.name, zhemchug.cap_on, zhemchug.filename);

 

zhemchug.tube_ext_pressed(zhemchug.size, zhemchug.weight, zhemchug.name, zhemchug.filename);

 

zhemchug.tube_ext_closed(zhemchug.name, zhemchug.cap_on, zhemchug.filename);

 

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

 

New tube zhemchug with size of 70 and weight of 120

You opened the tube zhemchug, cap_on=false

You pressed the tube zhemchug, weight=110, size=50

You released the tube zhemchug, weight=110, size=70

You closed the tube zhemchug, cap_on=true

Tube zhemchug, weight=110, size=70

 

Параллельно должен был создаться текстовый файл zhemchug.txt, в котором записаны результаты выполнения методов. Если не задавать пути, то он находится в папке, соответствующей проекту в папке рабочей области (workspace). Его содержимое:

 

Size=70, weight=120, name=zhemchug, cap_on=true zhemchug.txt

Tube is opened

cap_on = false

Tube is pressed

Name = zhemchug, size = 50, weight = 110

Tube is released

Name = zhemchug, size = 70, weight = 110

Y o u ' v e c l o s e d t h e t u b e z h e m c h u g , c a p _ o n = t r u e s i z e = 7 0 w e i g h t = 1 1 0

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

Таким образом, мы создали новый класс на основе существующего. Основное отличие – запись данных полей, которые изменяются в процессе выполнения методов, в текстовый файл.

Рассмотрим еще один пример класса с расширением. Это будет описание прямоугольника. Поля (свойства) класса: стороны. Методы класса – вычисление периметра, площади и диагонали. Текст программы, описывающей класс:

 

public class rectangle {

int a, b;

rectangle(int a, int b){

this.a=a;

this.b=b;

}

void square (int a, int b){

int square=a*b;

System.out.println("Площадь равна "+square);

}

 

void perimeter(int a, int b){

int perimeter=(a+b)*2;

System.out.println("Периметр равен "+perimeter);

}

void diag (int a, int b){

double diag=Math.sqrt(a*a+b*b);

System.out.println("Диагональ равна "+diag);

}

 

 

}

Теперь расширим класс прямоугольника до прямоугольного параллелепипеда. Очевидно, что в новом классе добавится поле высоты. Методы расширенного класса будут рассчитывать диагональ уже объемного параллелепипеда и его объем:

public class parall extends rectangle{

int h;

parall(int a, int b, int h){

super(a,b);

this.h=h;

}

void diag(int a, int b, int h){

double diag=Math.sqrt(a*a+b*b+h*h);

System.out.println("Диагональ параллелепипеда равна "+diag);

}

 

void obyem(int a, int b, int h){

int obyem=a*b*h;

System.out.println("Объем параллелепипеда равен "+obyem);

}

 

}

 

С классом прямоугольника/параллелепипеда разобраться самостоятельно.

Вопросы к работе:

1. Что такое наследование?

2. Как наследование реализуется в Java?

3. Что такое полиморфизм?

4. Был ли реализован полиморфизм в примерах, приведенных в лабораторной работе 3? Если да, то где именно?

5. Для чего применяется ключевое слово super?

6. Сколько конструкторов может быть у класса-потомка? У класса-предка?

7. Поясните синтаксис создания потока BufferedWriter, приведенного в работе.

8. Что такое перегрузка метода?

9. Что такое перезапись метода?

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

11. Что такое инкапсуляция?

12. Поясните синтаксис и применение конструкции try-catch. Приведите пять примеров стандартных исключений.

13. Что такое метод?

14. Каким образом осуществляется вызов метода?

15. Особенности использования ключевых слов private, public, protected

 

 




<== предыдущая лекция | следующая лекция ==>
Лабораторная работа 3 | Использование статических полей


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 6.598 сек.