[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