Скачиваний:
2
Добавлен:
13.06.2024
Размер:
106.75 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

_____________________________________________________________________

Факультет Информационных систем и технологий

Кафедра Безопасности информационных систем

Дисциплина «Кроссплатформенное программирование»

ОТЧЕТ

за практическое работу №5

Тема: Проектирование классов с наследованием

Выполнил

Студент 2 курса, гр. ИСТ-222

__________ Шумов В.В.

Принял

Зав. кафедрой БИС

____________ Бородянский Ю.М.

Цель работы:

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

Теоретическая часть:

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

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

В приведенной ниже программе создаются суперкласс А и подкласс В.

// создать суперкласс

class A {

int i , j;

void showij ( ) {

System.out.println("i и j : " + i + " " + j );

}

}

// создать подкласс путем расширения класса А

class B extends А {

int k;

void showk() {

System.out.println( "k : " + k);

}

void sum( ) {

System.out.println("i+j+k: " + ( i+j+k) );

}

}

class SimpleDemo {

public static void main (String args [ ]) {

А superOb = new А( );

В subOb = new В( );

// суперкласс может использоваться самостоятельно

superOb. i = 10;

superOb. j = 20;

System.out.println("Coдepжимoe объекта superOb : ");

superOb. showij( );

System.out.println( );

// Подкласс имеет доступ ко всем открытым членам своего суперкласса.

subOb.i = 7;

subOb.j = 8;

subOb.k = 9;

System.out.println("Coдepжимoe объекта subOb : " );

subOb.showij ( );

subOb.showk ( );

System.out.println( ) ;

System.out.println("Cyммa i,j и k в объекте subOb : ");

subOb.sum ( );

}

}

Эта программа выводит следующий результат:

Содержимое объекта superOb:

i и j: 10 20

Содержимое объекта subOb:

i и j: 7 8

k: 9

Сумма i, j и k в объекте subOb:

i+j+k: 24

По определению подкласс В включает в себя все члены своего суперкласса А. Именно поэтому объект subOb имеет доступ к переменным i и j и может вызывать метод showij ( ). Кроме того, в методе sum ( ) возможна непосредственная ссылка на переменные i и j , как если бы они были частью класса В.

Несмотря на то что класс А является суперклассом для класса В, он в то же время остается полностью независимым и самостоятельным классом. То, что один класс является суперклассом для другого класса, совсем не исключает возможность его самостоятельного использования. Более того, один подкласс может быть суперклассом другого подкласса.

Ключевое слово static

Методы экземпляра и методы класса

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

objectReference.someMethod();

objectReference.someOtherMethod(parameter);

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

Поле PI объявлено как final (завершенное). Это позволяет предотвратить изменение содержимого переменной, сделав ее, по существу, констан-той. Следовательно, завершенное поле должно быть инициализировано во время его объявления. Значение такому полю можно присвоить и в пределах конструктора, но первый подход более распространен. В практике программирования нa java идентификаторы всех за -вершенных полей принято обозначать прописными буквами, как в примере. Кроме полей, объявленными как final, моrут быть параметры метода и локальные переменные. Объявление параметра как final препятствует его изменению в пределах метода, тогда как аналогичное объявление локальной переменной -присвоению ей значения больше одного раза.

Статические переменные

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

Ход работы:

(Меню и вывод 1 действия)

(Меню и вывод 2 действия)

(Меню и вывод 3 действия)

(Меню и вывод 4 действия)

Вывод:

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

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

Организовать не в отдельных переменных товары а создать массив из 5 элементов ссылающихся на базовый класс не инициализируя его

Приложение

import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; // Базовый класс Товар class Product { protected String name; // Свойство название товара protected double price; // Свойство цена товара private static int productCount = 0; // Статическая переменная для отслеживания количества товаров // Конструктор класса Товар public Product(String name, double price) { this.name = name; this.price = price; productCount++; // При создании нового товара увеличиваем количество товаров на 1 } // Геттер для свойства название public String getName() { return name; } // Сеттер для свойства название public void setName(String name) { this.name = name; } // Геттер для свойства цена public double getPrice() { return price; } // Сеттер для свойства цена public void setPrice(double price) { this.price = price; } // Статический метод для получения количества товаров public static int getProductCount() { return productCount; } } // Производный класс Одежда class Clothing extends Product { // Конструктор класса Одежда public Clothing(String name, double price) { super(name, price); // Вызываем конструктор базового класса } } // Производный класс Обувь class Footwear extends Product { // Конструктор класса Обувь public Footwear(String name, double price) { super(name, price); // Вызываем конструктор базового класса } } public class Main { private static ArrayList<Product> products = new ArrayList<>(); // Список товаров public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Создаем несколько объектов products.add(new Clothing("Футболка", 500)); products.add(new Footwear("Кроссовки", 1000)); int choice; do { // Выводим меню на экран System.out.println("Меню:"); System.out.println("1. Отобразить свойства товаров"); System.out.println("2. Изменить свойства товара"); System.out.println("3. Вычислить самый дорогой товар"); System.out.println("4. Вывести количество товаров"); System.out.println("5. Выход"); System.out.print("Выберите действие: "); choice = scanner.nextInt(); switch (choice) { case 1: displayProperties(); break; case 2: modifyProperties(scanner); break; case 3: calculateMostExpensiveProduct(); break; case 4: printProductCount(); break; case 5: System.out.println("Выход из программы."); break; default: System.out.println("Некорректный выбор. Попробуйте еще раз."); break; } } while (choice != 5); } // Метод для отображения свойств товаров private static void displayProperties() { System.out.println("Свойства товаров:"); for (Product product : products) { System.out.println("Товар: " + product.getName() + ", Цена: " + product.getPrice()); } } // Метод для изменения свойств товара private static void modifyProperties(Scanner scanner) { System.out.println("Выберите товар для изменения свойств:"); for (int i = 0; i < products.size(); i++) { System.out.println((i + 1) + ". " + products.get(i).getName()); } int productChoice = scanner.nextInt(); if (productChoice >= 1 && productChoice <= products.size()) { Product product = products.get(productChoice - 1); System.out.print("Введите новое название: "); scanner.nextLine(); String newName = scanner.nextLine(); System.out.print("Введите новую цену: "); double newPrice = scanner.nextDouble(); product.setName(newName); product.setPrice(newPrice); System.out.println("Свойства товара успешно изменены."); } else { System.out.println("Некорректный выбор товара."); } } // Метод для вычисления самого дорогого товара private static void calculateMostExpensiveProduct() { Product mostExpensive = Collections.max(products, (p1, p2) -> Double.compare(p1.getPrice(), p2.getPrice())); System.out.println("Самый дорогой товар: " + mostExpensive.getName() + ", Цена: " + mostExpensive.getPrice()); } // Метод для вывода количества товаров private static void printProductCount() { System.out.println("Количество товаров: " + Product.getProductCount()); } }

Санкт-Петербург 2024

Соседние файлы в папке ЛАБЫ