Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java2.pptx
Скачиваний:
132
Добавлен:
16.04.2015
Размер:
138.48 Кб
Скачать

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

Соседние файлы в папке java1_2013_2014