
- •JAVA-ТЕХНОЛОГИЯ
- •Объекты и классы
- •Наследование классов (inheritance)
- •Корректное и некорректное проектирование классов
- •Создание объекта и объектная ссылка
- •Модификаторы доступа; поля и методы
- •Более полное определение класса Car
- •Использование классов Vehicle и Car
- •Модификаторы static и final
- •Модификаторы доступа поля i класса C
- •Модификаторы доступа метода p класса C
- •Модификаторы доступа класса C
- •Модификаторы доступа пакета (package p)
- •Класс Object - предок всех классов
- •Интерфейсы (interfaces)
- •Иcпользование интерфейсов
- •Использование интерфейсов (продолжение)
- •Использование интерфейсов (продолжение)
- •Ромбоидальное наследование (diamond inheritance) на Java

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 2

Объекты и классы
Класс (class) – совокупность полей (fields) и методов
(methods)
Конструктор (constructor) – метод, создающий объект и инициализирующий его поля
Деструкторов в Java нет (есть сборщик мусора)
public class Vehicle { public String name; public int speed;
public Vehicle(string aName, int aSpeed)
{name = aName; speed = aSpeed;
//Другой вариант: this.name = aName; … } // this – текущий объект
}// Vehicle
(C)В.О. Сафонов.
2013

Наследование классов (inheritance)
Подкласс (subclass), или класс-потомок, наследует поля и методы класса-предка:
public class Car extends Vehicle { public int nPass;
public Car(String aName, int aSpeed, int aNPass)
{
super(aName, aSpeed); // calls Vehicle constructor nPass = aNPass;
}
} // Car
(C) В.О. Сафонов. 2013

Корректное и некорректное проектирование классов
Корректно:
public class Vehicle{ … }
public class Car extends Vehicle{ … }
Car– средство передвижения с дополнительным
свойством – числом пассажиров (nPass) Отношение между классами: Car is-a Vehicle
Некорректно:
public class Car{ … }
public class CarPark extends Car{ … }
CarPark – автомобиль (возможно – null, если его
нет) , площадка для его стоянки и касса
Правильное отношение между классами: CarPark has-part Car
В данном случае было бы корректно описать в классе CarPark поле типа Car
(C) В.О. Сафонов. 2013

Создание объекта и объектная ссылка
public class VehicleUser {
public static void main(String[] args)
{ Vehicle p = new Vehicle(“Boeing747”, 1000); // p – объектная ссылка
System.out.println
( “Vehicle: (“ + p.name + “,” + p.speed + “)” );
// p.name, p.speed – обращения к полям объекта p класса Point Car с = new Car(“Mercedes600S”, 250, 4);
// с.nPass – число пассажиров
Vehicle сс = с; // ссылка на объект класса-потомка сс.speed = 100;
// с.speed == 100, так как это ссылка на один и тот же объект } // сс.nPass – некорректное обращение
} // VehicleUser
(C) В.О. Сафонов. 2013

Модификаторы доступа; поля и методы
public class Vehicle { // более правильный и полный вариант private String name;
private int speed;
// name, speed – поля, скрытые в объекте класса Vehicle // вариант:
// protected String name; // protected int speed;
// - доступны и потомкам класса Vehicle public Vehicle(String aName, int aSpeed) { name = aName; speed = aSpeed; }
public String getName() { return name; } // свойство Name public void setName(String name) { this.name = name; }
// свойство Name
public int getSpeed() { return speed; } // свойство Speed public void setSpeed(int speed) { this.speed = speed; } //
свойство Speed
public String toString()
{ return (“Vehicle: (“ + name + “,” + speed + “)”); } } // Vehicle
(C) В.О. Сафонов. 2013

Более полное определение класса Car
public class Car extends Vehicle {
// наследуются методы: getName(), getSpeed(),
// setName(), setSpeed() private int nPass;
public Car(String aName, int aSpeed, int aNPass)
{ super(aName, aSpeed); nPass = aNPass; } public int getNPass() { return nPass; }
public void setNPass(int aNPass) { nPass = aNPass; } public String toString()
{ return (“Car: <“ + super.toString() + “ NPass: “ + nPass + “>”);
} } // … + super + … - ошибка!
(C) В.О. Сафонов. 2013

Использование классов Vehicle и Car
public class VehicleCarUser { |
|
|
public static void main(String[] args) |
||
{Vehicle a = new Vehicle(“Boeing747”,1000); |
||
Car p = new Car(“Mercedes600S”, 250, 4); |
||
Vehicle pp = p; |
a = Vehicle: (Boeing747,1000) |
|
System.out.println(“a = “ + a); // |
||
System.out.println(“p =“ + p); |
|
|
// |
p = Car: <Vehicle: (Mercedes600S,250) nPass: 4> |
|
System.out.println(“pp =“ +pp); |
|
|
// |
pp = Car: <Vehicle: (Mercedes600S,250) nPass: 4> |
|
// Метод toString работает как классический виртуальный метод: |
||
// обращается к фактическому |
типу объекта, на который ссылается |
|
// |
объектная ссылка. |
|
// |
Несколько слов о реализации виртуальных |
|
// |
методов через VMT: |
|
// Car -> VMT(Car): { … index (Car, toString): <ptr_to_toString_impl_in_Car> … }
// Идея виртуальных методов: index(Vehicle, toString) == Car, toString) !!!
}
} // VehicleCarUser
(C) В.О. Сафонов. 2013

Модификаторы static и final
public class GeomLib {
// вариант: public final class CircleLib …
public static final double TWO_PI = 2 * Math.PI; // константа
public static double circleLength(double r) { return TWO_PI * r ;}
} // GeomLib
public class GeomLibUser {
public static void main(String[] args)
{ System.out.println(“2 * pi = “ + GeomLib.TWO_PI);
// 2 * pi = 6.283185307179586 System.out.println(“Length= “ +
GeomLib.circleLength(2.0));
}
} // GeomLibUser
(C) В.О. Сафонов. 2013

Модификаторы доступа поля i класса C
По умолчанию (int i) – поле доступно как поле объекта класса C
из всех классов текущего пакета (package visibility)static int i – статическое поле класса C; доступно только в
статических методах класса C или по ссылке C.i (статические поля
– аналог глобальных переменных)
public int i – поле i доступно в любом классе, использующем Cprivate int i – поле i доступно только в классе C
protected int i – поле i доступно в классе C и его потомках, либо из
других классов текущего пакета
final int i – константа; должна иметь инициализацию: final int i = 1transient int i – поле несущественно при сохранении состояния
объекта (т.е. не сериализуется)
volatile int i – обращения к полю i из нескольких потоков
(threads) согласованы; каждый поток всегда видит корректное значение i
В C# (.NET) дополнительные модификаторы, по сравнению с Java: internal – локализованный внутри сборки; sealed – аналог final; virtual – виртуальный; override – переопределяемый;
new - новый
(C) В.О. Сафонов. 2013