java КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в...

37
ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ Ненко Табаков Пламен Танов Технологическо училище “Електронни системи” Технически университет – София 24 септември 2008

Upload: others

Post on 25-Aug-2020

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

КЛАСОВЕ И ИНТЕРФЕЙСИ

Ненко ТабаковПламен Танов

Технологическо училище “Електронни системи”Технически университет – София

24 септември 2008

Page 2: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 2

КЛАСОВЕ И ИНТЕРФЕЙСИ

Забележка: Тази лекция е адаптация на лекция от курса:

●6.092 Java Preparation for 6.170, Януари 2006● Lucy Mendel● Corey McCaffrey● Rob Toscano● Justin Mazolla Paluska● Scott Osler● Ray HeИнтернет адрес:http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-092January--IAP--2006/CourseHome/index.htm

Лиценз: Creative Commons – BY – NC – SA

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 3: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 3

ОСНОВНИ ТЕРМИНИ

●class – класовете описват обекти●interface – интерфейсът дава списък на достъпните методи●instance – физическото представяне на даден клас или интерфейс в паметта

●метод – функция, която е дефинирана в класа●поле – променлива, която е част от класа●статично поле – променлива, която е една и съща за всички инстанции на класа

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 4: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 4

ТИПОВЕ ДАННИ

Типове данни:

●примитивни типове●обекти

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 5: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 5

ОБЕКТИ

●Обектът е инстанция на клас●За създаване на инстанция на клас се използва операторът new●Операторът new:

● Заделя място в паметта за новия обект● Извиква съответния конструктор● Връща препратка към новия обект

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 6: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 6

ПРИМЕРинстанциране на клас

име на класа

Bean bean = new Bean();

име на обекта конструктор

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 7: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 7

УПОТРЕБА НА ОБЕКТИ

public static void main(String[] args) {Bean bean = new Bean();bean.plantBean(); // Invoked on instance

}

Чрез обект могат да се извикват методи

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 8: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 8

УПОТРЕБА НА ОБЕКТИ

Чрез обект могат да се достигат член-променливи (полета)

public static void main(String[] args) {Point myPoint = new Point ();myPoint.x = 10;myPoint.y = 15;

}

Когато този обект повече не ни трябва просто спираме да го използваме. Паметта заемана от него ще бъде освободена, когато няма повече препратки към него.

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 9: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 9

ДЕФИНИЦИЯ НА КЛАС

[достъп][abstract/final] class име_на_класа extends име_на_класimplements име_на_интерфейс, ...{

//конструктор//методи//полета

}

public class Point {...

}

Шаблонът за дефиниране на клас изглежда по следния начин:

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 10: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 10

ЧЛЕНОВЕ НА КЛАСА

Един клас може да има следните членове:●конструктор●член-променливи (и статични)●методи (и статични)●вложени класове

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 11: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 11

КОНСТРУКТОР

●Конструкторът трябва да има същото име, като това на класа●Един клас може да има няколко конструктора●В конструктора се извършва инициализация на класа

[достъп]име_на_класа ([аргументи]){//тяло на конструктора

}

public class Point {public Point () {

...}...

}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 12: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 12

ПРИМЕРконструктори

public class HelloWorld {

public String myString;

public HelloWorld (String helloMessage) { myString = helloMessage;

}

public HelloWorld () { myString = "Hello, World";

}

public static void main(String[] args) { HelloWorld myHelloWorld = new HelloWorld();

HelloWorld myHelloWorld2 = new HelloWorld("Hello!!!");}

}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 13: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 13

МЕТОДИ

●Методите извършват операции●Методите работят върху състоянието на класа●Методите могат да имат произволен брой аргументи и връщат максимум една стойност●Ако даден метод не връща стойност, то неговият тип е void●Един клас може да има произволен брой методи

[достъп]тип име_на_метода ([аргументи]){//тяло на метода

}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 14: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 14

ПРИМЕРметоди

class Box {public boolean isEmpty() {

...}

public int numberOfBooks() {...

}}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 15: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 15

ПРЕДЕФИНИРАНЕ НА МЕТОДИ OVERLOADING

●В един клас може да има два метода с еднакво име стига аргументите да са им различни●Методът се извиква на базата на името му плюс аргументите му

void foo () {}

void foo (int a) {}

public static void main (String[] args) { obj.foo(); //извиква първия метод obj.foo(7); //извиква втория метод}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 16: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 16

ПОЛЕТА

●Полето е част от клас●Полето е променлива – съдържа данни●Всяко поле има тип, който определя какъв вид данни ще се записват в него

[достъп]тип име_на_променлив [= стойност];

public class Bean { public int beanCounter = 0; public Date date;

}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 17: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 17

ПРИМЕР

public class BankAccount { private int balance;

public BankAccount() { balance = 0;

}

public void withdraw(int amount) { balance = balance - amount;

}

public void deposit(int amount) { balance = balance + amount;

}}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 18: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 18

ДОСТЪП

●Достъпът се определя с една от четирите ключови думи● public – всеки клас от всеки пакет има достъп● protected – всеки подклас има достъп● (default) – само класове от същия пакет имат достъп● private – само съответния клас има достъп

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 19: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 19

НАСЛЕДЯВАНЕ

●Чрез наследяване даден клас може да наследи функционалност от друг клас●Чрез наследяване може да се постигне по-добра абстракция на функционалността и данните●Наследяването намалява сложността на големи софтуерни системи

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 20: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 20

НАСЛЕДЯВАНЕ

●Две отделни идеи с различно поведение, но имат базова функционалност която е обща

Банкова сметка

Разплащателна сметка Депозит

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 21: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 21

ИНТЕРФЕЙСИ

[достъп]interface име_на_интерфейсаextends име_на_интерфейс, ... {

//методи}

interface BankAccount { public void withdraw(int amount); public void deposit(int amount);}

●Интерфейсът дава списък на достъпните методи●В интерфейс се декларират методи, но не се дефинират●Интерфейсите нямат конструктори

Шаблонът за интерфейс изглежда по следния начин:

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 22: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 22

УПОТРЕБА НА ИНТЕРФЕЙСИ

●Един клас може да имплементира един или няколко интерфейса●Един интерфейс може да разшири друг интерфейс●Ако един клас имплементира даден интерфейс, то този клас трябва да предостави реализация на всеки метод от интерфейса (тяло на методите)●Ако един клас имплементира няколко интерфейса то този клас трябва да предостави реализация на всеки метод от всеки интерфейс

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 23: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 23

ПРИМЕРупотреба на интерфейси

public class CheckingAccount implements BankAccount {private int balance;

public CheckingAccount(int initial) { balance = initial;

} // implemented methods from BankAccount public void withdraw(int amount) { balance = balance - amount;

}

public void deposit(int amount) { balance = balance + amount;

}

public int getBalance() { return balance;

}}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 24: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 24

АБСТРАКТНИ КЛАСОВЕ

●Абстрактният клас е нещо средно между интерфейс и клас● може да има дефинирани методи● може да има полета

●Помага да се дефинира една идея както като функционалност така и като данни●В един абстрактен клас може да се разположат методи, които имат обща функционалност за всички подкласове●Абстрактен клас се дефинира с ключовата дума abstract

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 25: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 25

ПРИМЕРупотреба на абстрактен клас

public abstract class BankAccount { protected int balance;

public int getBalance() { return balance;

}

public void deposit(int amount) { balance = balance + amount;

}

public abstract void withdraw(int amount);}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 26: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 26

ПРИМЕРнаследяване на клас

public class CheckingAccount extends BankAccount { public CheckingAccount () { balance = 0;

}

public void withdraw (int amount) { balance = balance - amount;

}}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 27: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 27

ПРИМЕРнаследяване на клас

public class SavingsAccount extends BankAccount { private int numberOfWithdrawals;

public SavingsAccount() { balance = 0; numberOfWithdrawals = 0;

}

public void withdraw(int amount) { if (numberOfWithdrawals > 5) { throw new RuntimeException("Cannot make >5 withdrawals a month"); } else { balance = balance - amount; numberOfWithdrawals++;

}}

public void resetNumOfWithdrawals() {}

}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 28: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 28

ПОЛИМОРФИЗЪМ

●Свойството на обектите да реагират по собствен начин в зависимост от типа си, на извикване на един и същ метод (същото име на метод)●Свойството на обектите от различен тип да реагират на методи с едно и също име●Свойството да се предефинира функционалност чрез наследяване

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 29: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 29

КЛАСЪТ Object

●Всеки клас е наследник на java.lang.Object класа●java.lang.Object съдържа методи, които се наследяват от всеки клас :

● clone● equals● finalize● getClass● hashCode● notify● notifyAll● toString● wait

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 30: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 30

ПРЕДЕФИНИРАНЕ НА МЕТОДИ OVERRIDING

●Родителски клас● ако клас А наследява клас Б, то клас Б е родителски клас на

клас А● съответно клас А е подклас на клас Б

●Ако клас Б съдържа метод, до който клас А има достъп, то клас А може да предефинира този метод

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 31: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 31

ТИП ПО ВРЕМЕ НА КОМПИЛАЦИЯ И ТИП ПО ВРЕМЕ НА ИЗПЪЛНЕНИЕ

●Тип по време на компилация● Тип, който се знае предварително – знае се по време на писане

на кода – по време на компилация ● По време на работа на приложението, типът по време на

компилация никога не се променя за дадена инстанция●Тип по време на изпълнение

● Компилаторът не знае какъв тип ще е даден обект по време на работа на приложението

Object int1 = new Integer (10);//compile type //runtime typeObject int2 = new Integer (100);int1.equals(int2);

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 32: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 32

ТИП ПО ВРЕМЕ НА КОМПИЛАЦИЯ И ТИП ПО ВРЕМЕ НА ИЗПЪЛНЕНИЕ

●Типът по време на компилация на int1 е Object, но все пак се извиква equals метода на класа Integer●Това се случва, защото се извиква метода на базата на типа по време на изпълнение

Object int1 = new Integer (10);//compile type //runtime typeObject int2 = new Integer (100);int1.equals(int2);

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 33: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 33

ПРИМЕРполиморфизъм

public abstract class BankAccount { ... public abstract void withdraw(int amount);

...}

public class CheckingAccount extends BankAccount {...

public void withdraw (int amount) { balance = balance - amount;

}...

}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 34: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 34

ПРИМЕРполиморфизъм

public class SavingsAccount extends BankAccount { ... public void withdraw(int amount) { if (numberOfWithdrawals > 5) { throw new RuntimeException("Cannot make >5 withdrawals a month"); } else { balance = balance - amount; numberOfWithdrawals++;

}}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 35: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 35

ПРИМЕРполиморфизъм

public static void main (String[] args) { BankAccount b1 = new CheckingAccount(10); BankAccount b2 = new SavingsAccount(10);

b1.withdraw(5); //calls CheckingAccount.withdraw(int)

b2.withdraw(5); //calls SavingsAccount.withdraw(int)}

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 36: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 36

ПРИМЕРаргументи

public void foo (BankAccount account) {account.withdraw(5);

}

В този случай може да се предаде обект от тип CheckingAccount или SavingAccount и компилаторът няма да разбере

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA

Page 37: JAVA КЛАСОВЕ И ИНТЕРФЕЙСИ - Софтуерно обучение в ...lubo.elsys-bg.org/wp-content/uploads/2008/09/java-03... · 2010. 5. 18. · 6.092 Java Preparation

24.09.08 CC-BY-SA 37

ПРЕДИМСТВА ПРИ УПОТРЕБА НА РОДИТЕЛСКИ ТИПОВЕ

●Може да се промени имплементацията на по – късен етап●Не се налага да се променя кодът, защото се използват функции, които са общи (не са дефинирани в някой от подкласовете)●Пример: имплементацията на метода get(int n) в класовете ArrayList и LinkedList

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA