[Java] Классы. Перегрузка, this, наследование, переопределение
- Перегрузка методов
- Оператор this
- Наследование
- Переопределение методов (
override
) - Всякое
- Непонятные возможности
Перегрузка методов
Язык Java позволяет создавать несколько методов с одинаковыми именами, но с разными списками параметров. Параметры должны отличаться типом и своим количеством.
Данное свойство называется перегрузкой (overloading
)
Например:
class Point { int х, y; Point() { x = 10; y = 10; } //Перегруженный конструктор Point(int aX, int aY) { x = aX; y = aY; } } public class Hello { public static void main(String args[]) { Point p1 = new Point(); //Вызов обычного конструктора Point p2 = new Point(10, 20); //Вызов перегруженного конструктора System.out.println("x1 = " + p1.х + " у1 = " + p1.y); System.out.println("x2 = " + p2.х + " у2 = " + p2.y); } }
Оператор this
Оператор this
я уже вскользь употреблял. С помощью него можно не только обратиться к переменным конкретного класса внутри него самого, но и вызывать методы и конструкторы. Немного напоминает рекурсию.
Например:
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } Point() { this(-1, -1); //конструктор вызывает другой конструктор } }
Пока не понимаю зачем это нужно. По мне, так это усложняет чтение кода.
Наследование
Наследование представляет из себя механизм передачи методов и данных класса-родителя классу-потомку. Объявление класса потомка осуществляется с помощью ключевого слова extends
Возьмем пример:
//базовый класс - машина. имеет 4 колеса :) class Car { int wheels; car() { System.out.println("Car"); wheels = 4; } } //машина с автоматической коробкой передач class CarAutoTransmission extends Car { int pedals; CarAutoTransmission() { System.out.println("CarAutoTransmission"); pedals = 2; } } //машина с ручной коробкой передач class CarManualTransmission extends Car { int pedals; CarManualTransmission() { System.out.println("CarManualTransmission"); pedals = 3; } }
Пример притянут к реальной жизни, чтобы был понятнее.
Здесь мы имеем базовый класс Машина и двух потомков с разной коробкой передач. Потомки наследуют от родителя 4 колеса (т.к. это общее свойство) и каждый задаёт для себя количество педалей.
При создании экземпляра класса-потомка сначала вызывается конструктор родителя, а потом конструктор самого потомка. (Деструкторы вызываются в обратном порядке, но в Java их вызывает автоматический сборщик мусора и управлять ими нельзя)
CarAutoTransmission acar = new CarAutoTransmission();
В выводе увидим:
Car CarAutoTransmission
Кроме того, потомку доступны переменные и методы родителя
System.out.println("Wheels " + acar.wheels + ", Pedals " + acar.pedals);
Множественное наследование в Java отсутствует
Переопределение методов (override
)
Если перегрузка функций возможна внутри одного класса, то переопределение работает при наследовании и дает возможность переопределить у метода реализацию.
Пример
class MyClass { int x, y; MyClass() { x = 10; y = 20; } int opp() { return x*y; } } class MyNewClass extends MyClass { int opp() { return x*x; } }
При использовании
MyNewClass nc = new MyNewClass(); System.out.println(nc.opp());
Получим 100, а не 200.
Всякое
* Все методы и переменные объектов могут быть замещены по умолчанию. Если же вы хотите объявить, что подклассы не имеют права замещать какие-либо переменные и методы вашего класса, вам нужно объявить их как final
* В Java существует возможность объявлять методы с именем finalize
. Методы finalize
аналогичны деструкторам в C++ (ключевой знак ~) и Delphi (ключевое слово destructor
). Исполняющая среда Java будет вызывать его каждый раз, когда сборщик мусора соберется уничтожить объект этого класса. (Как продемонстрировать работу - не понимаю)
Непонятные возможности
Слово super
позволяет обратиться непосредственно к конструктору суперкласса
Нет обратных ссылок на эту запись.
Leave a comment