Записки программиста Программирование и не только

25Сен/120

[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 позволяет обратиться непосредственно к конструктору суперкласса

Комментарии (0) Пинги (0)

Пока нет комментариев.


Leave a comment

Нет обратных ссылок на эту запись.