3. JavaLecture_Classes.ppt
- Количество слайдов: 93
Object 1
Классы и методы Описание класса <модификатор> class <Имя. Класса> {[модификатор] <тип> <переменная_экземпляра 1>; … [модификатор] <тип> <переменная_экземпляра. N>; [модификатор] <тип> <метод_класса 1>(<список форм. парам. ) { // тело метода; } … [модификатор] <тип> <метод_класса. М>(<список форм. парам. >) { // тело метода; } } 2
Классы и методы Описание класса class Point {int x, y; Point () Экземплярные переменные (instance variables) {x=0; y=0; } Point (int x 1, int y 1) Конструкторы Члены класса (class (перегруженные) members) {x=x 1; y=y 1; } int get. X() {return x; } int get. Y() {return y; } } Методы класса (methods) 3
Классы и методы Создание ссылочных переменных и объектов класса создана ссылочная переменная Point p 1; p 1 = new Point(); создан объект «короткая форма» создания объекта создана ссылочная переменная указывающая на p 1 Point p 2 = new Point(); Point p 3 = p 1; объект p 3 p 1 cсылка на объект 4
Классы и методы Создание ссылочных переменных и объектов класса Cannot find variable p 1 Point p 1; { p 1 = new Point(5, 10); p 1 = null; } System. out. println(p 1. x + "" + p 1. y); 5, 10 {Point p 1 = new Point(5, 10); } System. out. println(p 1. x + "" + p 1. y); Null. Pointer. Exception Point p 2; {Point p 1 = new Point(5, 10); p 2 = p 1; p 1 = null; } System. out. println(p 2. x + “, “ + p 2. y); 5
Классы и методы Перегрузка (overloading) методов [модификатор] <тип> <имя_метода> (<список форм. парам. ) сигнатура метода Перегрузка – создание 2 и более методов с одинаковыми именами но разными сигнатурами 6
Классы и методы Перегрузка (overloading) методов class Overload. Demo {void test() {System. out. println(“Параметры отсутствуют”); } void test(int a, int b) {System. out. println(“a и b: ” + a + ” “ + b); } void test(double a) {System. out. println(“Вещественное a: ” + a); } } 7
instanceof() // Объявляем класс Parent class Parent { } Object Parent Child // Объявляем класс Child и наследуем // его от класса Parent class Child extends Parent { } Parent p = new Child(); // проверяем переменную p типа Parent // на совместимость с типом Child System. out. println(p instanceof Child); 8
instanceof() Object Parent Child // Объявляем новый класс и наследуем // его от класса Child class Child. Of. Child extends Child { } Теперь заведем переменную нового типа: Parent p = new Child. Of. Child(); System. out. println(p instanceof Child); Child. Of. C hild 9
instanceof() Добавим еще один класс: class Child 2 extends Parent { } И снова объявим переменную типа Parent: Object Parent p=new Child(); System. out. println(p instanceof Child 2); Parent Child 2 Child 10
== и != Point p 1=new Point(2, 3); Point p 2=p 1; Point p 3=new Point(2, 3); print(p 1==p 2); print(p 1==p 3); Результатом будет: true false Вывод: Не используйте == для ссылочных типов 11
Object В любом классе есть следующие методы из класса Object • • equals() hash. Code() to. String() get. Class() 12
get. Class() Этот метод возвращает объект класса Class, который описывает класс, от которого был порожден этот объект. У него есть метод get. Name(), возвращающий имя класса: String s = "abc"; Class cl=s. get. Class(); System. out. println(cl. get. Name()); Результатом будет строка: java. lang. String В отличие от оператора instanceof, метод get. Class() всегда возвращает точно тот класс, от которого был порожден объект. 13
equals() Point p 1=new Point(2, 3); Point p 2=new Point(2, 3); System. out. println(p 1. equals(p 2)); public boolean equals(Object o) { // Сначала необходимо убедиться, что переданный объект совместим //с типом Point if (o instanceof Point) { // Типы совместимы, можно провести преобразование Point p = (Point)o; // Возвращаем результат сравнения координат return p. x==x && p. y==y; } // Если объект не совместим с Point, возвращаем false return false; } 14
hash. Code() Данный метод возвращает значение int. Цель hash. Code() – представить любой объект целым числом. Особенно эффективно это используется в хэш-таблицах @Override public int hash. Code() { final int prime = 31; int result = 1; result = prime * result + var. A; result = prime * result + var. B; return result; } 15
to. String() Для класса Object и его наследников, не переопределивших to. String(), метод возвращает следующее выражение: get. Class(). get. Name()+"@"+hash. Code() System. out. println(new Object()); Результатом будет: java. lang. Object@92 d 342 16
Класс String • Можно создавать без слова new String s = “Hello, World!!!”; • Immutable (неизменяемый) объект Породив объект, содержащий некое значение-строку, мы уже не можем изменить данное значение – необходимо создать новый объект. String s = “aaa”; s = “abc” + “def”; Используйте String. Builder если знаете, что строка будет часто меняться. 17
Класс String Если используется несколько литералов с одинаковым значением, для них компилятором будет создан один и тот же объект. String s 1 = "abc"; String s 2 = "abc"; String s 3 = "a"+"bc"; System. out. println(s 1==s 2); //true System. out. println(s 1==s 3); //true 18
Класс String Если же строка создается выражением, которое может быть вычислено только во время исполнения программы, то оно будет порождать новый объект: String s 1="abc"; String s 2="ab"; System. out. println(s 1==(s 2+"c")); //false 19
Классы обертки Byte Short Character Integer Long Float Double Boolean byte short char int long float double boolean 20
Классы обертки Integer a = 120; Integer b = 120; Integer c = 130; Integer d = 130; Integer e = new Integer(120); Integer f = new Integer(120); System. out. println(a==b); System. out. println(c==d); System. out. println(e==f); 21
Классы и методы Модификаторы доступа class Parent class Other {public int v 1; { private int v 2; // доступны v 1, v 3, v 4 protected int v 3; class Child // недоступна v 2 int v 4; extends Parent } { } // доступны v 1, v 3, v 4 // недоступна v 2 } 22
Классы и методы Модификаторы доступа В правильно спроектированном Javaклассе, все экземплярные переменные класса должны иметь модификатор private, доступ должен осуществляться через set/get методы ( «сеттеры/геттеры» ) В Eclipse: Source -> generate Getters and Setters 23
Классы и методы Модификаторы доступа class Point {private int x, y; class Point {int x, y; Point () {x=0; y=0; } Point (int x 1, int y 1) {x=x 1; y=y 1; } } Point () {x=0; y=0; } Point (int x 1, int y 1) {x=x 1; y=y 1; } public int get. X() {return x; } public int get. Y() {return y; } public int set. X(int x) { this. x = x; } public int set. Y(int y) { this. y = y; } } 24
Классы и методы Модификатор final 1. final double pi = 3. 14; //неизменяемая локальная переменная 2. final int get. X() {…} //метод, для которого запрещено переопределение (overriding) 3. final class A {…} //класс, для которого запрещено наследование 25
Классы и методы class A { final-члены классов, неизменяемые объекты final String m. Name; public A(String name) { m. Name = name; } public get. Name() { return m. Name; } public set. Name(String name) { m. Name = name; } } 26
final классы Не допускается создание наследников final класса Класс String и классы-обертки представляют собой final -классы. class Parent {} // = class Parent extends Object {} final class Last. Child extends Parent {} class Wrong. Child extends Last. Child {} // ошибка!! 27
Классы и методы Использование ключевого слова this 1. Чтобы обойти скрытие переменной экземпляра формальными параметрами Class Point { int x, y; Point (int x, int y) {this. x=x; this. y=y; } } 28
Классы и методы Использование ключевого слова this 2. Чтобы вызвать один конструктор из другого конструктора (explicit constructor invocation) public class Rectangle {private int x, y, w, h; public Rectangle() {this. x = 0; this. y = 0; this. w = 0; this. h = 0; } public Rectangle(int w, int h) {this. x = 0; this. y = 0; this. w = w; this. h = h; } public Rectangle(int x, int y, int w, int h) {this. x = x; this. y = y; this. w = w; this. h = h; } } 29
Классы и методы Использование ключевого слова this 2. Чтобы вызвать один конструктор из другого конструктора (explicit constructor invocation) public class Rectangle {private int x, y, w, h; public Rectangle() {this(0, 0, 0, 0); } public Rectangle(int w, int h) {this(0, 0, w, h); } public Rectangle(int x, int y, int w, int h) {this. x = x; this. y = y; this. w = w; this. h = h; } } 30
Инициализаторы public class Test { private int x, y, z; // инициализатор объекта { x=3; if (x>0) y=4; z=Math. max(x, y); } } Инициализаторы не имеют имен, исполняются при создании объектов, не могут быть вызваны явно, не наследуются. 31
Порядок выполнения инициализаторов Три вида инициализирующего кода в классах: • конструкторы • инициализаторы переменных • объектные инициализаторы 32
Порядок выполнения инициализаторов • если первой строкой идет обращение к конструктору родительского класса (явное или добавленное компилятором по умолчанию), то этот конструктор исполняется; • в случае успешного исполнения вызываются все инициализаторы полей и объекта в том порядке, в каком они объявлены в теле класса; • если первой строкой идет обращение к другому конструктору этого же класса, то он вызывается. Повторное выполнение инициализаторов не производится. 33
Классы и методы Модификатор static Статические переменные Объявление: static <type> <name> Обращение: <classname>. <varname> Статические переменные: • создаются в единственном экземпляре • существуют вне зависимости от объектов класса • создаются JVM в момент первого обращения к классу • допускают обращение до создания объектов класса 34
Статические поля class Human { public static int total. Count; } Human. total. Count++; Human h = new Human(); h. total. Count=100; 35
Классы и методы Модификатор static Статические методы Объявление: static <type> <name> (<parameters>) Обращение: <classname>. <metodname>() Статические методы: • могут вызывать только другие статические методы данного класса • должны обращаться только к статическим переменным • внутри статических методов нельзя использовать ссылки this и super 36
Статические методы class Human { private static int total. Count; public static int get. Total. Count() { return total. Count; } } Human h=null; h. get. Total. Count(); // два эквивалентных Human. get. Total. Count(); // обращения к одному // и тому же методу 37
Классы и методы Модификатор static Статические блоки кода Объявление: static { … } Код выполняется один раз во время загрузки класса в память виртуальной машины. 38
Классы и методы Вложенные классы Статические вложенные классы Нестатические вложенные классы (static nested classes) (inner classes внутренние классы) Причины создания вложенных классов: 1. Логическая группировка классов 2. Расширяет возможности инкапсуляции 3. В некоторых случаях повышает читабельность кода 39
Классы и методы Статические вложенные классы Статический вложенный класс является статическим членом класса, в который он вложен. Т. е. он не может напрямую работать с нестатическими переменными и методами внешнего класса. 40
Классы и методы Статические вложенные классы class A { static int x; int y; A() { System. out. println("constructor A"); } static class B {B() { System. out. println("constrcutor B"); x = 5; public class Test { A a = new A(); public static void main(String[ ] args) a. y = 15; { } A. B b = new A. B(); } } 41
Статические вложенные классы public class Question { private Type type; public Type get. Type() { return type; } public void set. Type(Type type) { this. type = type; } public static enum Type { SINGLE_CHOICE, MULIT_CHOICE, TEXT } } Question. Type type = question. get. Type(); if (type == Question. Type. TEXT) {. . . } 42
Классы и методы Нестатические вложенные классы Нестатический вложенный класс является обычным членом внешнего класса, т. е. существует только в составе объекта внешнего класса и имеет прямой доступ к переменным и методам внешнего класса. Объект вложенного класса может существовать только внутри объекта внешнего класса Существуют (и довольно часто используются) также анонимные внутренние классы (рассмотрим в обработке событий) 43
Классы и методы Нестатические вложенные классы class A { static int x; int y; A() { System. out. println("constructor A"); } class B { B() { System. out. println("constrcutor B"); x = 5; public class Test { y = 15; public static void main(String[ ] args) } { A a = new A(); } A. B b = a. new B(); } } } 44
Анонимные классы Анонимный класс (anonymous class) - это локальный класс без имени. public class Test { public static void main(String[ ] args) { new Thread(new Runnable() { public void run() {. . . } }). start(); } } 45
Анонимные классы Использование анонимных классов оправдано во многих случаях, в частности когда: • тело класса является очень коротким; • нужен только один экземпляр класса; • класс используется в месте его создания или сразу после него; • имя класса не важно и не облегчает понимание кода. 46
Классы и методы Наследование Общая форма объявления класса, наследующего суперкласс: class <subclass_name> extends <superclass_name> { //тело класса } Язык Java не поддерживает множественного наследования классов!!! 47
Классы и методы Наследование class Point 3 D extends Point {int z; Point 3 D () { z=0; } Point 3 D (int x 1, int y 1, int z 1) { z=z 1; } } 48
Классы и методы Порядок вызова конструкторов при наследовании При создании объекта подкласса всегда вызывается конструктор его базового класса, у того конструктор его базового класса и т. д. вплоть до корня иерархии (класса Object). Причем если не указано явно (с помощью super) вызывается конструктор без параметров (созданный явно или по умолчанию). Если подходящего конструктора нет – выдается ошибка компиляции. 49
Классы и методы Ключевое слово super • Вызов конструктора непосредственного суперкласса super (parameters) – вызов должен быть первым в конструкторе подкласса Внимание! Это применяется только если надо вызвать конструктор суперкласса с параметрами! 2. Доступ к элементу суперкласса, скрытому элементом подкласса super. var_name или super. metod_name() (super не влияет на тип доступа) 50
Классы и методы Порядок вызова конструкторов при наследовании без использования super class Point 3 D extends Point {int z; Point 3 D () { z=0; } Point 3 D (int x 1, int y 1, int z 1) { z=z 1; } Point 3 D p 3 d = new Point 3 D(); Point() -> Point 3 D() Point 3 D p 3 d = new Point 3 D(10, 20, 30); Point() -> Point 3 D(10, 20, 30) } 51
Классы и методы Порядок вызова конструкторов при наследовании с использованием super class Point 3 D extends Point {int z; Point 3 D () { z=0; } Point 3 D (int x 1, int y 1, int z 1) { super (x 1, y 1); Point 3 D p 3 d = new Point 3 D(); Point() -> Point 3 D() Point 3 D p 3 d = new Point 3 D(10, 20, 30); Point(10, 20) -> Point 3 D(10, 20, 30) z=z 1; } } 52
Классы и методы Динамическая диспетчеризация ссылок Ссылочной переменной суперкласса может быть назначена ссылка на любой подкласс, производный от этого суперкласса. Если ссылочная переменная суперкласса указывает на объект подкласса, через эту переменную можно получить доступ только к тем членам подкласса, которые определяются в суперклассе. 53
Классы и методы Динамическая диспетчеризация ссылок class Point Pobj = new Point(); { int x, int y; Point 3 D Cobj = new Point 3 D(); Pobj = Cobj; } class Point 3 D extends Point { int z; } … Pobj. x = 1; //верно! x определена в Point Pobj. z = 10; //ошибка! z не определена в Point … 54
Классы и методы Динамическая диспетчеризация методов Переопределение метода (overriding) – создание в подклассе метода, совпадающего по сигнатуре с методом суперкласса. Динамическая диспетчеризация методов – это механизм, позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции. 55
Классы и методы Динамическая диспетчеризация методов class Figure class Rectangle extends Figure {double dim 1, dim 2; {Rectangle(double a, double b) Figure(double a, double b) {super(a, b); } {dim 1 = a; dim 2 = b; } void square() {System. out. println (“Square is not defined”); } {System. out. println(“Rectangle square = ” + (dim 1*dim 2)); } } } 56
Классы и методы Динамическая диспетчеризация методов class Triangle extends Figure {Triangle(double a, double b) {super(a, b); } void square() {System. out. println(“Trian gle square= ” + (dim 1*dim 2/2)); } } class Find. Square {public static void main(String args[ ]) {Figure f; Random r = new Random(); for (int k=0; k<10; k++) { int i = r. next. Int(100); if (i<50) { f = new Rectangle(9, 5); } else { f = new Triangle(10, 8); } f. square(); } } } 57
Классы и методы Динамическая диспетчеризация методов Вывод этой программы: Rectangle square = 45. 0 Triangle square= 40. 0 Rectangle square = 45. 0 58
Задание class Speaker { public String answer(final String question){…} } Привет привет Как дела нормально Какой сейчас день Tue Nov 03 16: 18: 44 MSK 2015 Как тебя зовут Говорилка END Для отображения даты использовать класс Date date = new Date(); System. out. println(date); 59
Part 2 60
Классы и методы Абстрактные методы и классы Объявление абстрактного метода: abstract <type> <method_name> (<parameters>); Если в классе есть хотя бы один абстрактный метод -> класс должен быть объявлен абстрактным. abstract class <class_name> { … } Любой подкласс абстрактного класса должен или реализовать все его абстрактные методы или сам должен быть объявлен абстрактным ! 61
Классы и методы Абстрактные методы и классы abstract class Figure {double dim 1, dim 2; Figure(double a, double b) {dim 1 = a; dim 2 = b; } abstract void square(); } 62
Интерфейсы [<модификатор>] interface <имя> [extends <список интерфейсов>] { <тип> <имя_метода>(<список параметров>); . . . <тип> <имя_константы> = <значение>; } 1. Интерфейсы допускают множественное наследование 2. Все методы – абстрактные (без модификатора abstract) 3. Все переменные – static и final (без соотв. модификаторов), необходима инициализация 4. Все переменные и методы – public (без модификатора) 63
Интерфейсы Реализация интерфейсов class <имя_класса> [extends <имя_суперкласса>] [implements <список интерфейсов>] { …} interface Callback {void callback(int param); } class Client implements Callback {public void callback(int p) {System. out. println("callback called with " + p); } } 64
Интерфейсы Реализация интерфейсов 1. Методы, которые реализуют интерфейс, должны быть объявлены как public. Сигнатура типа реализующего метода должна точно соответствовать сигнатуре типа, указанной в определении интерфейса. 2. Если класс включает интерфейс, но реализует не все его методы, то такой класс должен быть объявлен как абстрактный. 3. Если класс реализует интерфейс, унаследованный от другого интерфейса, класс должен реализовать все методы, определенные в цепочке наследования интерфейсов. 65
Реализация интерфейса interface A { int get. Value(); } interface B { double get. Value(); } Если попытаться объявить класс, реализующий оба эти интерфейса, то возникнет ошибка компиляции. В классе оказывается два разных метода с одинаковой сигнатурой, что является неразрешимым конфликтом. Это единственное ограничение на набор интерфейсов, которые может реализовывать класс. 66
Абстрактный класс vs. интерфейс Абстрактные классы используются только тогда, когда есть "is a" тип отношений; интерфейсы могут быть реализованы классами которые не связаны друг с другом. Абстрактный класс может реализовывать методы; интерфейс не может реализовывать методы. Интерфейс может только описывать константы и методы, но не реализовывать их. Все методы интерфейса по-умолчанию являются публичными (public) и абстрактными (abstract), а поля - public static final. 67
Абстрактный класс vs. интерфейс В Java класс может наследоваться (реализовывать) от многих интерфейсов, но только от одного абстрактного класса. С абстрактными классами вы теряете индивидуальность класса, наследующего его; с интерфейсами вы просто расширяете функциональность каждого класса. Абстрактные классы содержат частичную реализацию, которая дополняется в подклассах. Если в абстрактном классе отсутствует частичная реализация, то вместо него рекомендуется использовать интерфейс. 68
Интерфейсы Ссылочные переменные интерфейсного типа interface Callback {void callback(int param); } class Client implements Callback { public void callback(int p) //реализация метода интерфейса {System. out. println("callback called with " + p); } int get. Square(int p) //собственный метод класса {System. out. println("square = " + (p*p)); } } 69
Интерфейсы Ссылочные переменные интерфейсного типа class Test. Iface {public static void main(String args[ ]) {Callback с = new Client(); c. callback(42); //верно! c. get. Square(42); //ошибка! ссылочная переменная интерфейсного типа не может обращаться к собственным методам классов } } 70
Интерфейсы Взаимоотношения классов и интерфейсов Классы Интерфейсы implements C 1 I 1 extends C 2 C 3 extends implements extends C 4 C 5 C 6 C 7 I 2 I 3 extends I 4 I 5 I 6 I 7 extends I 8 71
Классы и методы Перечисления в Java: enum Season { WINTER, SPRING, SUMMER, AUTUMN } Season season = Season. SPRING; if (season == Season. SPRING) { season = Season. SUMMER; } System. out. println(season); 72
Классы и методы Перечисление – это класс Объявляя enum мы неявно создаем класс производный от java. lang. Enum. Конструкция enum Season {. . . } эквивалентна class Season extends java. lang. Enum {. . . }. Явным образом наследоваться от java. lang. Enum не позволяет компилятор, но: System. out. println(Season. class. get. Superclass()); дает вывод: class java. lang. Enum 73
Классы и методы Перечисление – это класс Собственно наследование за нас автоматически выполняет компилятор Java. Условимся называть класс, созданный компилятором для реализации перечисления – enum-классом, а возможные значения перечисляемого типа – элементами enum-a. Элементы перечисления - экземпляры enumкласса, доступные статически. 74
Классы и методы Название и порядковый номер элемента enum Любой enum-класс наследует java. lang. Enum, который содержит ряд методов полезных для всех перечислений. Пример: Season season = Season. WINTER; System. out. println("season. name()=" + season. name() + " season. to. String()=" + season. to. String() + " season. ordinal()=" + season. ordinal()); Вывод: season. name()=WINTER season. to. String()=WINTER season. ordinal()=0 75
Классы и методы Получение элемента по строковому имени Задача: получить элемент enum по его строковому представлению. Решение: В каждом enum-классе компилятор автоматически создает специальный статический метод: public static Enum. Class value. Of(String name), который возвращает элемент перечисления Enum. Class с названием, равным name. Пример использования: String name = "WINTER"; Season season = Season. value. Of(name); Результат: переменная season будет равна Season. WINTER. Если элемент не будет найден, то будет выброшен Illegal. Argument. Exception, а если name равен null Null. Pointer. Exception. 76
Классы и методы Получение всех элементов перечисления Иногда необходимо получить список всех элементов enumкласса во время выполнения. Для этих целей в каждом enumклассе компилятор создает метод: public static Enum. Class[ ] values() Пример использования: System. out. println(Arrays. to. String(Season. values())); Вывод: [WINTER, SPRING, SUMMER, AUTUMN] Обратите внимание, что ни метод value. Of(), ни метод values() не определен в классе java. lang. Enum. Вместо этого они автоматически добавляются компилятором на этапе компиляции enum-класса. 77
Классы и методы Методы с переменным числом аргументов в Java Возможность была добавлена в JDK 1. 5. Для указания аргумента переменной длины используют три точки (. . . ). Например: static void va. Test(int. . . v) { … } Эта синтаксическая конструкция указывает компилятору, что метод va. Test () может вызываться с нулем или более аргументов. В результате v неявно объявляется как массив типа int [ ]. Таким образом, внутри метода va. Test () доступ к v осуществляется с использованием синтаксиса обычного массива. 78
Классы и методы Методы с переменным числом аргументов в Java class Var. Args { static void va. Test(int. . . v) { System. out. println("Кол-во аргументов: " + v. length); for (int i=0; i<v. length; i++) { System. out. print (v[i] + " "); } public static void main(String args[]) { va. Test (10); //1 аргумент va. Test (1, 2, 3); //3 аргумента va. Test (); // без аргументов } } 79
Классы и методы Методы с переменным числом аргументов в Java Вывод: Количество аргументов: 1 10 Количество аргументов: 3 123 Количество аргументов: 0 80
Классы и методы Методы с переменным числом аргументов в Java Вместе с параметром переменной длины массив может содержать обычные параметры. Однако параметр переменной длины должен быть последним параметром, объявленным методом. Например: int dolt(int a, int b, double с, int. . . vals) //верно! int dolt (int a, int b, double с, int. . . vals, boolean stop. Flag) // ошибка! Метод должен содержать только одни параметр типа varargs. int dolt (int a, int b, double с, int. . . vals, double. . . morevals) // ошибка! 81
Пакеты Понятие пакета Java обеспечивает специальный механизм для разделения пространства имен классов на именованные области. Этот механизм называется «пакеты» (packages). Пакет – это контейнер для классов, в пределах которого должна сохраняться уникальность имен классов. Общая форма определения пакета: package <pkg_name>; 82
Пакеты Иерархия пакетов: package pkg 1[. pkg 2[. pkg 3]]; Чтобы хранить пакеты, Java использует каталоги файловой системы. Classфайлы для всех классов, принадлежащих к одному пакету, должны быть сохранены в каталоге, название которого совпадает с именем пакета (регистр важен). package java. awt. image; javaawtimage Размещением корня любой иерархии пакетов в файловой системе управляет специальная переменная окружения CLASSPATH. 83
Пакеты Импорт пакетов Полное имя класса включает всю иерархию пакетов. Импорт класса или пакета: import pkg 1[. pkg 2]. (classname|*); 1. Импортирование класса никак не влияет на уровень доступа к его элементам !!! 2. В любую Java-программу автоматически импортируется пакет java. lang. * !!! 84
Уникальность имен пакетов Создатели Java предлагают следующий способ уникального именования пакетов. Если программа создается разработчиком, у которого есть Internet-сайт, либо же он работает на организацию, у которой имеется сайт, и доменное имя такого сайта, например, company. com, то имена пакетов должны начинаться с этих же слов, выписанных в обратном порядке: company. 85
Пакеты Уровни доступа с учетом пакетов package p 1; package p 2; public class A { public class D extends A { public int pub; } protected prot; public class E { int def; } private int priv; } public class B extends A { } public class C { } 86
Пакеты Уровни доступа с учетом пакетов A B C D E public + + + protected + + - <default> + + + - - private + - - 87
Пакеты Уровни доступа с учетом пакетов 1. Доступ на уровне класса: - public - класс виден везде - <default> - класс виден в пределах своего пакета 2. Доступ на уровне членов класса: Модификатор Внутри В том же класса пакете Подкласс в другом пакете Произвольный класс в другом пакете public + + protected + + + - <default> + + - - private + - - 88
Структура Java-программы - В первой строке файла может быть 1 необязательный оператор package - В следующих строках может быть 1 или несколько необязательных операторов import - Далее идут описания классов и интерфейсов Среди классов, описанных в одном файле, только один может быть объявлен с модификатором public. 89
Соглашение по именованию • • • Имя каждого пакета начинается с маленькой буквы и представляет собой, как правило, одно недлинное слово. Если требуется составить название из нескольких слов, можно воспользоваться знаком подчеркивания или начинать следующее слово с большой буквы. Имена типов и интерфейсов начинаются с большой буквы и могут состоять из нескольких слов, каждое следующее слово также начинается с большой буквы. Point, Array. Index. Out. Of. Bounds. Exception Имена методов должны быть глаголами и обозначать действия, которые совершает данный метод. Имя должно начинаться с маленькой буквы, но может состоять из нескольких слов, причем каждое следующее слово начинается с заглавной буквы. 90
Соглашение по именованию 3. a) Если методы предназначены для чтения и изменения значения переменной, то их имена начинаются, соответственно, с get и set, например, для переменной size это будут get. Size() и set. Size() ; метод, возвращающий длину, называется length(), например, в классе String ; 3. b) имя метода, который проверяет булевское условие, начинается с is, например, is. Visible() у компонента графического пользовательского интерфейса; 3. c) метод, который преобразует величину в формат F, называется to. F(), например, метод to. String(), который приводит любой объект к строке. 91
Соглашение по именованию 4) Поля класса имеют имена, записываемые в том же стиле, что и для методов, начинаются с маленькой буквы, могут состоять из нескольких слов, каждое следующее слово начинается с заглавной буквы. Имена должны быть существительными. 5) Поля могут быть константами, если в их объявлении стоит ключевое слово final. Их имена состоят из последовательности слов, сокращений, аббревиатур. Записываются они только большими буквами, слова разделяются знаками подчеркивания: PI, MAX_VALUE 92
Массивы int array[]=new int[5]; for (int i=0; i<5; i++) { array[i]=i*i; } Point p[]=new Point[5]; for (int i=0; i<p. length; i++) { p[i]=new Point(i, i); } 93
3. JavaLecture_Classes.ppt