
- •Программирование на Java
- •Глава 1 Введение в java. Основы языка.
- •Тема 1.1 Язык программирования java.
- •Тема 1.2 Состав пакета Java2.
- •Тема 1.3 Настройка среды окружения.
- •Тема 1.4 Структура Java-программы.
- •Тема 1.5 Набор текста, запуск и компиляция простейшей программы.
- •Тема 1.6 Подробное рассмотрение кода простейшей программы.
- •Тема 1.7. Создание программы в разных средах разработки.
- •Тема 1.8 Лексические основы языка
- •Тема 1.9 Элементарные типы данных.
- •Тема 1.10 Преобразование типов.
- •Арифметические операции
- •Операции сравнения
- •Тема 1.11 Кoнсольный ввод с помощью класса java.Util.Scanner
- •Тема 1.12 Классы-оболочки
- •Тема 1.13 Автоупакока и автораспаковка.
- •Тема 1.14 Операторы
- •1.14.1 Блок
- •1.14.2 Условный оператор if
- •1.14.4 Оператор цикла while
- •1.14.5 Оператор цикла do-while
- •1.14.6 Оператор цикла for
- •1.14.7 Оператор continue и метки
- •1.14.8 Оператор break
- •1.14.9 Оператор варианта switch
- •Тема 1.15 Статический импорт
- •Тема 1.16 Класс Math
- •Задания
- •Тема 1.17 Псевдослучайные числа
- •Тема 1.18 Генерация случайных чисел
- •Тема 1.19 Массивы в Java
- •1.19.1 Объявление и заполнение массива
- •1.19.2 Сортировка массива
- •Сортировка выбором
- •Сортировка методом пузырька
- •1.19.3 Многомерные массивы
- •Задания
- •1.19.4 Нерегулярные массивы
- •Глава 2 классы
- •Тема 2.1 Основы классов
- •Тема 2.2 Общая форма класса
- •Тема 2.3 Объявление объектов
- •Тема 2.4 Более подробное рассмотрение операции new
- •Тема 2.5 Присваивание переменных объектных ссылок
- •Тема 2.6 Знакомство с методами
- •Тема 2.7 Возвращение значения из метода
- •Тема 2.8 Добавление метода, принимающего параметры
- •Тема 2.9 Конструкторы
- •Тема 2.10 Сборка мусора
- •Тема 2.11 Перегрузка методов
- •Тема 2.12 Перегрузка конструкторов
- •Тема 2.13 Использование объектов в качестве параметров
- •Тема 2.14 Более пристальный взгляд на передачу аргументов
- •Тема 2.16 Рекурсия
- •Тема 2.17 Введение в управление доступом
- •Тема 2.18 Ключевое слово static
- •Тема 2.19 Ключевое слово final
- •Тема 2.20 Аргументы переменной длины
- •Тема 2.21 Строки и числа
- •Тема 2.22 Нумерованные типы
- •Глава 3 наследование и интерфейсы
- •Тема 3.1 Основы наследования
- •Тема 3.2 Наследование и доступ к членам класса
- •Тема 3.3 Конструкторы и наследование
- •Тема 3.4 Использование ключевого слова super для вызова конструктора суперкласса
- •Тема 3.5 Использование ключевого слова super для доступа к членам суперкласса
- •Тема 3.6 Многоуровневая иерархия
- •Тема 3.7 Когда вызываются конструкторы
- •Тема 3.8 Объекты подклассов и ссылки на суперклассы
- •Тема 3.9 Переопределение методов
- •Тема 3.10 Переопределение методов и поддержка полиморфизма
- •Тема 3.11 Использование абстрактных классов
- •Тема 3.12 Использование ключевого слова final
- •Тема 3.13 Предотвращение переопределения методов
- •Тема 3.14 Предотвращение наследования
- •Тема 3.15 Класс Object
- •Тема 3.16 Интерфейсы
- •3.16.1 Объявление интерфейса.
- •3.16.2 Реализация интерфейсов
- •3.16.3 Использование ссылок на интерфейсы
- •3.16.4 Переменные в составе интерфейсов
- •3.16.5 Наследование интерфейсов
- •Тема 3.17 Пакеты и ограничение доступа
- •Тема 3.18 Внутренние классы
- •3.18.1 Внутренние (inner) классы
- •3.18.2 Вложенные (nested) классы
- •3.18.3 Анонимные (anonymous) классы
- •Глава 4 Обработка исключительных ситуаций
- •Тема 4.1 Исключения в Java
- •Тема 4.2 Типы исключений
- •Тема 4.3 Неперехваченные исключения
- •Тема 4.4 Ключевые слова try и catch
- •Тема 4.6 Ключевое слово throw
- •Тема 4.7 Ключевое слово throws
- •Тема 4.8 Ключевое слово finally
- •Ошибка при выполнении метода1 java.Lang.ArithmeticException: Demo
- •Тема 4.9 Потомки Exception или написание своих классов ошибок
- •Глава 5 Универсальные типы. КоллекциИ
- •Тема 5.1 Общие сведения об универсальных типах
- •Тема 5.2 Универсальный класс с двумя параметрами типа
- •Тема 5.3 Ограниченные типы
- •Тема 5.4 Использование групповых параметров
- •Тема 5.5 Универсальные методы
- •Тема 5.6 Универсальные интерфейсы
- •Тема 5.7 Ошибки неоднозначности
- •Тема 5.8 Ограничения универсальных типов
- •Тема 5.9 Краткий обзор коллекций
- •5.9.1 Класс ArrayList
- •5.9.2 Класс LinkedList
- •5.9.3 Класс HashSet
- •5.9.4 Класс TreeSet
- •5.9.5 Доступ к коллекции через итератор
- •5.9.6 Алгоритмы коллекций
- •Глава 6 jdbc (Java DataBase Connectivity) Тема 6.1 Драйверы, соединения и запросы
- •Тема 6.2 Простое соединение и простой запрос
- •Тема 6.2 Класс ResultSet
- •Тема 6.3 Метаданные
- •Тема 6.4 Подготовленные запросы
- •Глава 7 Swing и пользовательский интерфейс
- •Тема 7.1 Общие сведения о swing
- •Тема 7.2 Архитектура mvc
- •Тема 7.3 Контейнер и компоненты
- •Тема 7.4 Простая программа, использующая средства Swing
- •Тема 7.5 Поддержка событий
- •Тема 7.6 Использование кнопок и обработка событий
- •Тема 7.7 Краткие сведения о диспетчерах компоновки
- •Тема 7.8 Пример использования jdbc и swing вместе
Тема 3.2 Наследование и доступ к членам класса
Как вы знаете, часто переменные экземпляра объявляют как private, чтобы предотвратить их некорректное использование. Наследование класса никак не влияет на ограничения, накладываемые модификатором доступа private. Несмотря на то, что подкласс содержит все члены суперкласса, он не может обращаться к закрытым классам и методам. Рассмотрим в качестве примера следующий фрагмент кода. Если в классе TwoDShape переменные width, right объявлены как private, то класс Triangle не имеет к ним доступа(листинг 3.3).
Листинг 3.3
// Закрытые члены не наследуются
// Данная программа не будет компилироваться
// Класс, описывающий двумерные объекты
public class TwoDShape {
private double width; // Теперь эти переменные
private double height; // объявлены как private
public void showDim() {
System.out.println("Width and height are " +
width + " and " + height);
}
}
// Подкласс TwoDShape, представляющий треугольники
public class Triangle extends TwoDShape {
public String style;
public double area() {
return width * height / 2; // Ошибка! Доступ запрещен
}
public void showStyle() {
System.out.println("Triangle is " + style);
}
}
Класс Triangle не будет скомпилирован, поскольку ссылки на width и height в теле класса area () нарушают правила доступа. Поскольку эти переменные объявлены как private, они доступны только членам собственного класса. Подклассам обращаться к ним запрещено. Как вы помните, член класса, объявленный как private, недоступен из-за пределов класса. Это ограничение распространяется и на подклассы.
Поначалу может показаться, что отсутствие доступа к закрытым членам суперкласса – серьезный недостаток, затрудняющий программирование. Однако это не так. Как было сказано в модуле 6, в программах на Java для обеспечения доступа к закрытым членам класса обычно используются специальные методы. Ниже показаны модифицированные классы TwoDShape и Triangle, в которых обращения к переменным width и height производится посредством специальных методов(листинг 3.4)
Листинг 3.4
// Использование методов доступа для установки и
// получения значений закрытых переменных
// Класс, описывающий двумерные объекты
public class TwoDShape {
private double width; // Теперь эти переменные
private double height; // объявлены как private
// Методы доступа для переменных width и height
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
public void setWidth(double w) {
width = w;
}
public void setHeight(double h) {
height = h;
}
public void showDim() {
System.out.println("Width and height are "
+ width + " and " + height);
}
}
// Подкласс класса TwoDShape, представляющий треугольники
public class Triangle extends TwoDShape {
String style;
public double area() {
return getWidth() * getHeight() / 2;
}
public void showStyle() {
System.out.println("Triangle is " + style);
}
}
public class Shapes2 {
public static void main(String args[]) {
Triangle t1 = new Triangle();
Triangle t2 = new Triangle();
t1.setWidth(4.0);
t1.setHeight(4.0);
t1.style = "isosceles";
t2.setWidth(8.0);
t2.setHeight(12.0);
t2.style = "right";
System.out.println("Info for t1: ");
t1.showStyle();
t1.showDim();
System.out.println("Area is " + t1.area());
System.out.println();
System.out.println("Info for t2: ");
t2.showStyle();
t2.showDim();
System.out.println("Area is " + t2.area());
}
}
Не существует четких правил, позволяющих принять безошибочное решение по данному вопросу. Следует лишь придерживаться двух общих принципов. Если переменная экземпляра используется только методами определенными в классе, то она должна быть закрытой. Если значение переменной экземпляра не должно выходить за определенные границы, то следует объявить эту переменную как private, а доступ к ней организовать с помощью специальных методов. Таким образом, вы предотвратите присвоение переменной недопустимых значений.
Задание:
Измените в классе Животные все поля на private, внесите изменения в методы.