• Nie Znaleziono Wyników

Programowanie Obiektowe Java

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie Obiektowe Java"

Copied!
99
0
0

Pełen tekst

(1)

Programowanie Obiektowe

Java

Małgorzata Janik

Zakład Fizyki Jądrowej

malgorzata.janik@pw.edu.pl

http://java.fizyka.pw.edu.pl/

(2)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 2/30

Projekt

W drugim tygodniu zajęć należy wysłać prowadzącemu e-mail z informacją o:

Członkach zespołu

Pomyśle na projekt

Temat projektu powinien zostać uzgodniony z prowadzącym laboratoria przed przygotowaniem specyfikacji

Przykłady tematów na stronie http://java.fizyka.pw.edu.pl/Lista-projektow

Zawsze można wybrać własny projekt

Tematy w danej grupie nie mogą się powtarzać (kto pierwszy ten lepszy)

Wystarczy “OK” od prowadzącego

Projekt jest realizowany zespołowo, ale uzyskana ocena jest indywidualna.

Wkład każdego z członków zespołu będzie oceniany indywidualnie przez

prowadzącego.

(3)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Powtórzenie

Który element Javy sprawia, że stosunkowo łatwo odpalać programy na różnych

platformach / systemach operacyjnych ?

(4)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Maszyna Wirtualna

(5)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Struktura Programu Pakiety i Import

Struktura Klasy Instancja klasy

Metody

(6)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

package ... //deklaracja pakietu, opcjonalna ale zalecana import ... // deklaracje importu

public class Punkt {

//deklaracje konstruktorów

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

//deklaracje metod

public String Wypisz(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

}

//deklaracje pól double x , y;

}

public class KlasaStartowa {

public static void main(String[] args) { Punkt p1 = new Punkt (30,30);

System.out.println(p1.Wypisz());

} }

Struktura programu

//funkcja główna

(7)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

package ... //deklaracja pakietu, opcjonalna ale zalecana import ... // deklaracje importu

public class Punkt {

//deklaracje konstruktorów

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

//deklaracje metod

public String Wypisz(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

}

//deklaracje pól double x , y;

}

public class KlasaStartowa {

public static void main(String[] args) { Punkt p1 = new Punkt (30,30);

System.out.println(p1.Wypisz());

} }

Struktura programu

//funkcja główna

(8)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 8/98

Pakiety

Pakiet – zbiór powiązanych klas i interfejsów, który pozwala na kontrolę dostępu i zapewnia hierarchiczny system nazewnictwa.

Przykładami są: javax.swing, java.lang, java.io. …

pełna lista standardowych

pakietów w dokumentacji

(9)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 9/98

Pakiety

programy w Javie są złożone z zestawów pakietów, zawierających definicje klas i interfejsów

typ zadeklarowany w pakiecie jest dostępny na zewnątrz pakietu tylko gdy został zadeklarowany jako publiczny (public)

nazwa pakietu powinna być niepowtarzalna i jednocześnie określać jego charakter.

zaleca się by określić kraj pochodzenia pakietu przez standardowe, dwuliterowe kody ISO, np..

pl.edu.pw.fizyka.pojava.wyklad com.sun.examples

pakiet składa się z kompilowalnych plików, które automatycznie mają dostęp do wszystkich typów deklarowanych w pakiecie

jeśli plik nie zawiera deklaracji pakietu to domyślnie należy do

pakietu unnamed/default

(10)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 10/98

import

By odnieść się do klasy MojaKlasa z paczki lab.pw możemy podać jej pełną (kwalifikowaną) nazwę:

lab.pw.MojaKlasa mk = new lab.pw.MojaKlasa();

To jest konieczne, gdy w kilku różnych paczkach mamy klasę o tej samej nazwie

W “zwykłych” przypadkach to nie jest wygodne; możemy skrócić ilość pisania używając dyrektywy import

import lab.pw.MojaKlasa;

Wtedy w programie już możemy używać nazwy “MojaKlasa”.

Dyrektywa import jest bardzo często wykorzystywana gdy wykorzystujemy dostępne API

Wtedy możemy porównać ją do znanego nam “#include” z C/C++

(11)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Pliki nagłówkowe

W C/C++ używaliśmy plików nagłówkowych (.h lub .hpp) zawierające opis interfejsu

modułu:

Deklaracje zmiennych, funkcji, klas, w oddzielnym pliku itp.

W Javie (ani w C#) nie występują.

(12)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

package ... //deklaracja pakietu, opcjonalna ale zalecana import ... // deklaracje importu

public class Punkt {

//deklaracje konstruktorów

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

//deklaracje metod

public String Wypisz(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

}

//deklaracje pól double x , y;

}

public class KlasaStartowa {

public static void main(String[] args) { Punkt p1 = new Punkt (30,30);

System.out.println(p1.Wypisz());

} }

Struktura programu

//funkcja główna

(13)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

class NazwaKlasy {

//deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

(14)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

package ... //deklaracja pakietu, opcjonalna ale zalecana import ... // deklaracje importu

public class Punkt {

//deklaracje konstruktorów

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

//deklaracje metod

public String Wypisz(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

}

//deklaracje pól double x , y;

}

public class KlasaStartowa {

public static void main(String[] args) { Punkt p1 = new Punkt (30,30);

System.out.println(p1.Wypisz());

} }

Struktura programu

//funkcja główna

Przykład 1: tworzenie instancji klasy

(15)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 15/98

Tworzenie obiektów

NazwaKlasy zmienna; //deklaracja zmiennej/referencji zmienna = new NazwaKlasy(argumenty_konstruktora);

//tworzenie nowego obiektu przypisanego do referencji Przykład: (tworzenie obiektu klasy Rectangle):

Rectangle prostokat;

prostakat = new Rectangle(10,10,100,200);

Powyższy kod można uprościć, umieszczając deklarację zmiennej i tworzenie obiektu w jednej linii kodu:

NazwaKlasy zmienna = new NazwaKlasy(argumenty_konstruktora);

Przykład:

Rectangle prostokat = new Rectangle(10,10,100,200);

(16)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 16/98

ZAPAMIĘTAJ!

Obiekty w Javie zawsze tworzone są przy pomocy operatora new po którym następuje konstruktor (czyli nazwa klasy, której obiekt jest tworzony oraz lista argumentów w nawiasach).

Operator new rezerwuje pamięć dla nowego obiektu oraz wywołuje odpowiedni konstruktor (klasa może mieć więcej niż jeden konstruktor, o tym który zostanie wywołany decyduję zgodność listy argumentów).

Operator new zwraca referencję do nowo utworzonego obiektu.

KlasaPrzykladowa kp = new KlasaPrzykladowa();

KlasaPrzykladowa kp2 = new KlasaPrzykladowa(5,”tekst2”);

(17)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 17/98

Struktura klasy

Jak stworzyć

instancję tej klasy?

public static void main(String[] args) {

… … } package pl.wyklad1.klasapokazowa;

public class KlasaPrzykladowa { // deklaracje konstruktorów

KlasaPrzykladowa() { x = 0;

tekst = "domyslny";

}

// deklaracje metod

public void setX(int aX) { x = aX;

}

public int getX() { return x;

}

public void wypisz() {

System.out.println(x + " " + tekst);

}

// deklaracje pól int x;

String tekst;

}

Przykład 2: tworzenie instancji klasy

(18)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 18/98

Struktura klasy

Jak stworzyć

instancję tej klasy?

package pl.wyklad1.klasapokazowa;

public class KlasaPrzykladowa { // deklaracje konstruktorów

KlasaPrzykladowa() { x = 0;

tekst = "domyslny";

}

// deklaracje metod

public void setX(int aX) { x = aX;

}

public int getX() { return x;

}

public void wypisz() {

System.out.println(x + " " + tekst);

}

// deklaracje pól int x;

String tekst;

}

Przykład 2: tworzenie instancji klasy

public static void main(String[] args) {

KlasaPrzykladowa kp = new KlasaPrzykladowa();

kp.wypisz();

}

(19)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

package ... //deklaracja pakietu, opcjonalna ale zalecana import ... // deklaracje importu

public class Punkt {

//deklaracje konstruktorów

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

//deklaracje metod

public String Wypisz(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

}

//deklaracje pól double x , y;

}

public class KlasaStartowa {

public static void main(String[] args) { Punkt p1 = new Punkt (30,30);

System.out.println(p1.Wypisz());

} }

Struktura programu

//funkcja główna

Metody

=

Funkcje składowe

(20)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Definiowanie metody

[modyfikatory] TypZwracanejWartości nazwaMetody (TypArgumentu1 zmienna1, …,TypArgumentuN zmiennaN) { TypZwracanejWartości zwracanaWartość;

// kod metody, w którym można korzystać ze zmiennych 1..N oraz pól klasy

return zwracanaWartość;

// jeśli metoda „void” - nic nie zwraca }

• Metody mogą być zadeklarowane bezpośrednio w klasie lub

odziedziczone po nadklasach lub interfejsach.

(21)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

public class Punkt extends Object{

double x = 0 , y = 0;

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

void przesun(double parametr1, double parametr2){

x += parametr1;

y += parametr2;

}

double odlegloscOdPoczatkuUkladu(){

return Math.sqrt(x*x+y*y);

}

String toString(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

} }

Metody

(22)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Korzystanie z utworzonych metod

public class PunktTest2 {

public static void main(String[] args) { Punkt p = new Punkt(0,0);

int i=0;

while (i<10){

p.przesun(5, 10);

double d = p.odlegloscOdPoczatkuUkladu();

System.out.println(p +

" Odległość od (0, 0): " + d);

i++;

} }

}

(23)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Dziedziczenie

Tworzenie klas pochodnych Klasa Object

Konstruktory i Super

(24)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

class NazwaKlasy {

//deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

(25)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

[modyfikatory] class NazwaKlasy [extends

NazwaKlasyNadrzednej] [implements NazwaInterfejsu] { //deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

(26)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

[modyfikatory] class NazwaKlasy [extends

NazwaKlasyNadrzednej] [implements NazwaInterfejsu] { //deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

(27)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

[modyfikatory] class NazwaKlasy [extends

NazwaKlasyNadrzednej] [implements NazwaInterfejsu] { //deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

“extends” oznacza dziedziczenie

= rozszerzenie klasy nadrzędnej

Możemy dziedziczyć po własnych klasach, albo tych zawartych w standardowym API.

Jeśli chcemy uzyskać spersonalizowaną ramkę, dziedziczymy po JFrame.

Jeśli chcemy uzyskać spersonalizowany przycisk, dziedziczymy po JButton.

(28)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 28/98

Dziedziczenie

W jaki sposób zdefiniować klasę pochodną, dziedziczącą po już istniejącej?

public class KlasaPochodna extends KlasaPrzykladowa { public void wypisz()

{

System.out.println(x + " " + y + " " + tekst);

}

int y = 10;

}

public static void main(String[] args) {

//KlasaPrzykladowa kp = new KlasaPrzykladowa();

KlasaPochodna kp = new KlasaPochodna();

kp.wypisz();

}

Efekt?

package pl.wyklad1.klasapokazowa;

public class KlasaPrzykladowa { // deklaracje konstruktorów

KlasaPrzykladowa() { x = 0;

tekst = "domyslny";

}

// deklaracje metod

public void setX(int aX) { x = aX;

}

public int getX() { return x;

}

public void wypisz() {

System.out.println(x + " " + tekst);

}

// deklaracje pól int x;

String tekst;

}

(29)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 29/98

Dziedziczenie

W jaki sposób zdefiniować klasę pochodną, dziedziczącą po już istniejącej?

public class KlasaPochodna extends KlasaPrzykladowa { public void wypisz()

{

System.out.println(x + " " + y + " " + tekst);

}

int y = 10;

}

public static void main(String[] args) {

//KlasaPrzykladowa kp = new KlasaPrzykladowa();

KlasaPochodna kp = new KlasaPochodna();

kp.wypisz();

}

0 10 domyslny package pl.wyklad1.klasapokazowa;

public class KlasaPrzykladowa { // deklaracje konstruktorów

KlasaPrzykladowa() { x = 0;

tekst = "domyslny";

}

// deklaracje metod

public void setX(int aX) { x = aX;

}

public int getX() { return x;

}

public void wypisz() {

System.out.println(x + " " + tekst);

}

// deklaracje pól int x;

String tekst;

}

(30)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 30/98

Szybkie tworzenie klasy pochodnej w Eclipse

(31)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 31/98

Dziedziczenie

public class KlasaPochodna extends KlasaPrzykladowa { public void wypisz()

{

System.out.println(x + " " + y + " " + tekst);

}

int y = 10;

}

package pl.wyklad1.klasapokazowa;

public class KlasaPrzykladowa { // deklaracje konstruktorów

KlasaPrzykladowa() { x = 0;

tekst = "domyslny";

}

// deklaracje metod public void wypisz() {

System.out.println(x + " " + tekst);

}

// deklaracje pól int x;

String tekst;

}

Klasa Nadrzędna

“Superclass”

Klasa Pochodna (podrzędna)

“Subclass”

(32)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 32/98

[modyfikatory] class NazwaKlasy [extends

NazwaKlasyBazowej] [implements NazwaInterfejsu] { //deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

“extends” oznacza dziedziczenie.

Tworząc nową klasę w Javie zawsze używamy dziedziczenia.

Jeśli nie napiszemy jawnie “extends”,

w takim wypadku dziedzicznymy po klasie Object.

(33)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 33/98

Szybkie tworzenie klasy (Object)

(34)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 34/98

public class Punkt {

//konstruktor dwuargumentowy

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

//pola

double x = 0 , y = 0;

}

Przykład:

Nawet jeśli nie ma jawnego dziedziczenia, powstała klasa jest rozszrzerzeniem klasy Object -

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html . Powyższa deklaracji klasy jest równoważna temu:

public class Punkt extends Object { double x = 0 , y = 0;

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

}

(35)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 35/98

Klasa Object

(36)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 36/98

Klasa Object

(37)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 37/98

Przykład przedefiniowania (przeciążenia) metody toString() odziedziczonej z klasy bazowej Object

public class Punkt extends Object{

double x = 0 , y = 0;

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

public String toString(){

String text;

text = "Wspolrzedne ("+ x + ", " + y + ")";

return text;

}

}

(38)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 38/98

Klasa Object

(39)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 39/98

metoda equals()

Służy ona do porównywania, czy dwa obiekty są sobie równe.

Implementując metodę equals(), należy pamiętać o kilku zasadach

• metoda equals musi być zwrotna, czyli a.equals(a)==true.

• metoda equals musi być symetryczna, czyli a.equals(b)==b.equals(a).

• metoda equals musi być przechodnia, czyli jeżeli a.eqauls(b)==true i b.equals(c)==true to a.equals(c)==true. (Jednak gdy: a.equals(b)==false i b.equals(c)==false to a.equals(c) może być true)

• metoda equals musi być konsekwenta, czyli gdy dwa razy (w różnych chwilach czasu) porównujemy te same obiekty, to wynik tego porównania powinien być taki sam.

• obiekt jest nie równy null, czyli a.equals(null)==false dla każdego a nie będącego null

To metoda, której powinniśmy używać porównując dwa obiekty.

Np. dwa String-i:

– if (ala == “Ala”) – źle!

– if (ala.equals(“Ala”)) – dobrze

(40)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 40/98

[modyfikatory] class NazwaKlasy [extends

NazwaKlasyNadrzednej] [implements NazwaInterfejsu] { //deklaracje konstruktorów

NazwaKlasy(lista parametrów){

//treść/zawartość konstruktora }

//deklaracje metod

Typ1 metoda1(lista parametrów) { //treść/zawartość metody1

return obiektTyp1;

}

...

//deklaracje pól Typ pole1;

...

Typ poleN;

}

Struktura klasy

Konstruktory i

dziedziczenie

(41)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 41/98

Konstruktor

Specjalna metoda danej klasy, wywoływana podczas tworzenia jej instancji.

Podstawowym zadaniem konstruktora jest zainicjowanie obiektu.

W C++/Javie:

– Nazywa się tak samo jak klasa

– Nic nie zwraca (brak napisu void przed nazwą) – Może przyjmować:

0 parametrów (konstruktor domyślny / bezargumentowy)

kilka parametrów (konstruktory z argumentami)

Obiekt tej samej klasy (konstruktor kopiujący)

(42)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 42/98

public class Punkt{

Punkt (){

x = 0;

y = 0;

}

Punkt (double parametr1, double parametr2){

x = parametr1;

y = parametr2;

}

Punkt (Punkt p){

x = p.x;

y = p.y;

}

double x, y;

}

Konstruktory

Konstruktor domyślny

Konstruktor z parametrami Konstruktor

kopiujący

(43)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 43/98

public class Kolo extends Punkt { double promien = 0;

public Kolo(double parametr1, double parametr2, double parametr3) { super(parametr1, parametr2);

promien = parametr3;

}

public Kolo(){

super();

promien = 10;

}

public Kolo (Punkt p, double parametr ){

super(p.x, p.y);

promien = parametr;

}

public Kolo(Kolo k){

super(k.x,k.y);

promien = k.promien;

} }

Konstruktor kopiujący Konstruktor bezargumentowy – „domyślne” parametry klasy (nie trzeba pisać jawnie) super(p1, p2) jest takim samym wywołaniem konstruktora jak: new Punkt(p1,p2)

Konstruktory i dziedziczenie

(44)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 44/98

public class Kolo extends Punkt { double promien = 0;

public Kolo(double parametr1, double parametr2, double parametr3) { super(parametr1, parametr2);

promien = parametr3;

}

public Kolo(){

promien = 10;

}

public Kolo (Punkt p, double parametr ){

super(p.x, p.y);

promien = parametr;

}

public Kolo(Kolo k){

super(k.x,k.y);

promien = k.promien;

} }

Konstruktor kopiujący Java stworzyłaby pusty konstruktor domyślny dla klasy nadrzędnej.

Uwaga, jeśli klasa Punkt nie miałaby żadnego konstruktora: OK.

Konstruktory i dziedziczenie

(45)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 45/98

public class Kolo extends Punkt { double promien = 0;

public Kolo(double parametr1, double parametr2, double parametr3) { super(parametr1, parametr2);

promien = parametr3;

}

public Kolo(){

promien = 10;

}

public Kolo (Punkt p, double parametr ){

super(p.x, p.y);

promien = parametr;

}

public Kolo(Kolo k){

super(k.x,k.y);

promien = k.promien;

} }

Implicit super constructor punkt() is undefined.

Uwaga, jeśli klasa Punkt nie miałaby konstruktora bezargumentowego, ALE miała inny konstruktor, pojawi się błąd:

Konstruktory i dziedziczenie

(46)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 46/98

public class Kolo extends Punkt { double promien = 0;

public Kolo(double parametr1, double parametr2, double parametr3) { super(parametr1, parametr2);

promien = parametr3;

}

public Kolo(){

super(0,0);

promien = 10;

}

public Kolo (Punkt p, double parametr ){

super(p.x, p.y);

promien = parametr;

}

public Kolo(Kolo k){

super(k.x,k.y);

promien = k.promien;

} }

Konstruktory i dziedziczenie

(47)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 47/98

Użycie „super” jako Konstruktora

• Konstruktory nie są dziedziczone

• Wywołanie konstruktora nad-klasy:

super(lista-parametrow)

• Musi być pierwszą instrukcją konstruktora podklasy:

class NadKlasa { ... }

class PodKlasa extends NadKlasa { PodKlasa(...) {

super(...);

...

} …

}

(48)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 48/98

public class KoloTest {

public static void main(String[] args) { Kolo a,b,c,d,e;

// Wykorzystanie różnych konstruktorów:

a = new Kolo (10,10,5);

b = new Kolo();

Punkt p1 = new Punkt (30,30);

c = new Kolo (p1, 30);

d = new Kolo (new Punkt(40,40), 40 );

e = new Kolo(c);

System.out.println("" + a + "\n" + b + "\n"+ c + "\n" + d + "\n"+ e);

// Jeśli klasa pochodna Kolo nie ma zdefiniowanej własnej metody

// toString() wykorzystywana jest metoda toString klasy bazowej Punkt System.out.println(new Kolo(60,60,60)); // tworzenie "chwilowego"

// obiektu bez referencji, na potrzeby wywołania metody

} }

Użycie konstruktorów

(49)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 49/98

Odwołanie do Nadklasy przez „super”

• Odwołanie do elementu nad-klasy:

super.pole

super.metoda()

• Stosowane szczególnie gdy składowe pod- klasy przesłaniają składowe nad-klasy

o tych samych nazwach.

(50)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 50/98

public class Subclass extends Superclass {

// przeciąża (nadpisuje) metodę z nadklasy public void printMethod() {

super.printMethod();

System.out.println("Wypisano w podklasie");

}

public static void main(String[] args) { Subclass s = new Subclass();

s.printMethod();

} }

public class Superclass {

public void printMethod() {

System.out.println("Wypisano w nadklasie.");

} }

Użycie “super” w metodach

Efekt:

Wypisano w nadklasie.

Wypisano w podklasie.

Jeśli nadpiszemy metodę

z nadklasy, ale nadal chcemy ją wykorzystać,

możemy użyć słowa kluczowego “super”.

(51)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 51/98

Szybkie tworzenie klasy pochodnej w Eclipse

Stwórz metody:

Konstruktory z

klasy nadrzędnej

(52)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 52/98

public class ZamykaneOkienko extends JFrame {

public ZamykaneOkienko() throws HeadlessException {

}

public ZamykaneOkienko(GraphicsConfiguration arg0) { super(arg0);

}

public ZamykaneOkienko(String arg0) throws HeadlessException { super(arg0);

}

public ZamykaneOkienko(String arg0, GraphicsConfiguration arg1) {

super(arg0, arg1);

} /**

* @param args */

public static void main(String[] args) { ZamykaneOkienko zo = new ZamykaneOkienko();

zo.setVisible(true);

}

Konstruktory klasy nadrzędnej dodane przez Eclipse’a

Konstruktory z klasy nadrzędnej

(53)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 53/98

public class ZamykaneOkienko extends JFrame {

public ZamykaneOkienko() throws HeadlessException { this.setSize(640,480);

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public ZamykaneOkienko(GraphicsConfiguration arg0) { super(arg0);

this.setSize(640,480);

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public ZamykaneOkienko(String arg0) throws HeadlessException { super(arg0);

this.setSize(640,480);

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public ZamykaneOkienko(String arg0, GraphicsConfiguration arg1) {

super(arg0, arg1);

this.setSize(640,480);

setDefaultCloseOperation(EXIT_ON_CLOSE);

} /**

* @param args */

public static void main(String[] args) { ZamykaneOkienko zo = new ZamykaneOkienko();

zo.setVisible(true);

}

Nasze “rozszerzenie” klasy nadrzędnej:

konkretne ustawienia, dodatkowe elementy….

Konstruktory klasy nadrzędnej dodane przez Eclipse’a

Konstruktory z klasy nadrzędnej

(54)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Przygotowanie do laboratorium Komponenty w Javie

Podpowiedzi Eclipse’a

Layout Manager

(55)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 55/98

Trzy najpopularniejsze rodzaje programów:

• aplikacja konsolowa – samodzielny program

pracujący w trybie konsolowym/tekstowym systemu operacyjnego,

• aplikacja graficzna – samodzielny program pracujący w trybie graficznym (okienkowym)

• aplet – najczesciej nieduzy program napisany w jezyk Java i umieszczony na stronie HTML i

uruchamiany wraz z nia przez przegladarkę internetowa, obsługujaca jezyk Java.

(deprecated - już nie stosowane)

(56)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 56/98

JFrame frame = new JFrame();

frame.setSize(640, 480);

Frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

frame.setVisible(true);

public class MyFrame extends JFrame { public MyFrame()

{

this.setSize(640,480);

setDefaultCloseOperation(EXIT_ON_CLOSE);

} }

public static void main(String[] args) { MyFrame mf = new MyFrame();

mf.setVisible(true);

}

Komponenty

Okienka: JFrame

lub

(zalecane)

(57)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 57/98

JFrame frame = new JFrame();

frame.setSize(640, 480);

Frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

frame.setVisible(true);

public class MyFrame extends JFrame { public MyFrame()

{

this.setSize(640,480);

setDefaultCloseOperation(EXIT_ON_CLOSE);

} }

public static void main(String[] args) { MyFrame mf = new MyFrame();

mf.setVisible(true);

}

Komponenty

Okienka: JFrame

lub

(zalecane)

Dla domyślnego okna naciśnięcie [X] nie powoduje zamkniecia aplikacji. Aby to zmienić, należy

wywołać metodę setDefaultCloseOperation().

(58)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 58/98

SetDefaultCloseOperation()

EXIT_ON_CLOSE

– zamyka aplikację

DISPOSE_ON_CLOSE

– zamyka ramke, usuwa obiekt reprezentujacy ramke, ale pozostawia pracujaca aplikację

DO_NOTHING_ON_CLOSE

– nic nie robi

(pozostawia ramke otwarta i kontynuuje prace aplikacji)

HIDE_ON_CLOSE

– ukrywa ramke pozostawiajac pracujaca aplikacje (domyślne)

(59)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 59/98

Frame

Własne okienko [przykład]

(60)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 60/98

package pl.wyklad1.klasapokazowa;

import javax.swing.JFrame;

public class PierwszeOkienko extends JFrame { PierwszeOkienko()

{

this.setSize(500,500);

}

public static void main(String[] args) {

PierwszeOkienko po = new PierwszeOkienko();

po.setVisible(true);

} }

Dziedziczenie po JFrame

(61)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 61/98

JFrame frame = new JFrame();

frame.setSize(640, 480);

frame.setVisible(true);

public class MyFrame extends JFrame { public MyFrame()

{

this.setSize(640,480);

} }

public static void main(String[] args) { MyFrame mf = new MyFrame();

mf.setVisible(true);

}

Komponenty

Okienka: JFrame

lub

(zalecane)

Kontener: JPanel

JPanel panel = new JPanel();

public class MyPanel extends JPanel { ...

}

public static void main(String[] args) { MyPanel mp = new MyPanel();

}

lub

(62)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 62/98

Komponenty

Guzik: JButton

Pole tekstowe: JTextField Etykieta: JLabel

JButton buttonOK = new JButton("OK");

panel.add(buttonOK);

JLabel label = new JLabel("To jest etykieta");

panel.add(label);

JTextField field = new JTextField("To jest pole tekstowe");

panel.add(field);

(63)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 63/98

Dodawanie komponentu

utworzenie komponentu (obiektu pewnej klasy) oraz ustawienie jego właściwości

– Komponent komponent = new Komponent(arg);

wywołanie metody add() kontenera do którego chcemy dodać nasz komponent

– kontener.add(komponent)

Kontener (np. JPanel) to także rodzaj komponentu,

więc może być dodany jako element innego kontenera

– panelGlowny.add(panelMniejszy)

JButton button1 = new JButton("OK");

panel.add(button1);

(64)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 64/98

Okno

public class MyFrame extends JFrame { public MyFrame()

{

this.setSize(640,480);

}

public static void main(String[] args) { MyFrame mf = new MyFrame();

mf.setVisible(true);

} }

Konstruktor okna

Stworzenie instancji (egzemplarza) okna i wyświetlenie go

JFrame

(65)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 65/98

Okno z przyciskiem

1. Utworzenie komponentu

2. Wywołanie metody add

Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie...

JFrame

JButton

Przykład kodu na

stronie przedmiotu!

(66)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 66/98

Panel (w oknie) z przyciskiem

1. Utworzenie panelu

2. Umieszczenie panelu w oknie

4. Umieszczenie guzika w panelu (który jest w oknie) 3. Utworzenie kontrolki (guzika) Wewnątrz konstruktora okna dodajemy komponenty

które powinny się znaleźć w tym oknie…

Przykład kodu na

stronie przedmiotu!

(67)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 67/98

Kilka kontrolek

1. Utworzenie panelu i dodanie go do okna

3. Umieszczenie kontrolek w panelu

2. Utworzenie kontrolek

Wewnątrz konstruktora okna dodajemy komponenty które powinny się znaleźć w tym oknie…

public class KilkaKontrolek extends JFrame { public KilkaKontrolek()

{

this.setSize(400,400);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel panel = new JPanel();

add(panel);

JButton b1 = new JButton("Przycisk 1");

JButton b2 = new JButton("Przycisk 1");

JButton b3 = new JButton("Przycisk 1");

JLabel l1 = new JLabel("Napis 1");

JLabel l2 = new JLabel("Napis 2");

JTextField tf1 = new JTextField("Pole tekstowe");

panel.add(b1); panel.add(b2); panel.add(b3);

panel.add(l1); panel.add(l2);

panel.add(tf1);

}

public static void main(String[] args) { KilkaKontrolek okno = new KilkaKontrolek();

okno.setVisible(true);

} }

Przykład kodu na

stronie przedmiotu!

(68)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 68/98

JButton

JCheckBox

JComboBox

JList

JMenu

JRadioButton

JSlider

JSpinner

• JTextField

• JPasswordField

Kontrolki Swing

(69)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Wybrane kontrolki Swing (podstawowe)

Więcej na stronie:

http://web.mit.edu/6.005/www/sp14/psets/ps4/java-6-tutorial/components.html

(70)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 70/98

Kontrolki do wyświetlania informacji oraz kontrolki najwyższego poziomu

● JLabel

● JProgressBar

● JSeparator

● JToolTip

● JPanel

● JScrollPane

● JSplitPane

● JTabbedPane

● JToolBar

● JInternalFrame

● JLayeredPane

● RootPane

(71)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 71/98

Podpowiedzi Eclipse’a

Pamiętajcie o możliwości naciśnięcia ikonki błedu po lewej stronie, żeby:

Dodać odpowiednie pakiety (import-y)

Uzyskać podpowiedź jak naprawić błąd

Jeśli szukacie odpowiedniej metody, zawsze warto nacisnąć kropkę i przejrzeć listę dostępnych funkcji

Listę można też przywołać naciskając CTRL + spacja

https://help.eclipse.org

(72)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 72/98

Layout Manager

● Czyli jak ułożyć kontrolki w okienku?

– Zwykle nie chcemy “nawrzucać” ich jednej

po drugiej do okna

(73)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 73/98

Layout Manager

● Czyli jak ułożyć kontrolki w okienku?

– Zwykle nie chcemy “nawrzucać” ich jednej po drugiej do okna

– Co więcej, jeśli nie utworzymy panelu, a

będziemy dodawać kontrolki bezpośrednio do JFrame, to widoczna będzie tylko ostatnia!

Po dodaniu 5 przycisków widzimy

ostatni:

(74)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 74/98

Layout Manager

● Czyli jak ułożyć kontrolki w okienku?

● Od czego to zależy? Co możemy zrobić?

– Odpowiedź: zarządca układu

(Layout Manger)

(75)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 75/98

Rozmieszczanie komponenetów Layout Manager

Sposób rozmieszczenia komponentów w danym kontenerze zależny jest od wybranego zarządcy układu (Layout Manager)

JFrame i JPanel mają innych domyślnych zarządców

Zastosowanie zarządcy układu w kontenerze – metoda setLayout()

Predefiniowani zarządcy układu

ciągły – FlowLayout

siatkowy - GridLayout

brzegowy – BorderLayout

kartowy – CardLayout

torebkowy - GridBagLayout

pudełkowy – BoxLayout

wiosenny – SpringLayout

grupowy - GroupLayout

(76)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 76/98

Layout Manager

FlowLayout

– Najprostszy layout manager

i domyślny dla każdego JPanel’u.

– Wrzuca komponenty jeden po drugim do

pojedynczego wiersza. Jeśli zabraknie miejsca w danym wierszu, wrzuca do kolejnego.

– Umieszczenie komponentów zależy od rozmiaru

kontenera, więc nie możemy jasno określić, w którym dokładnie miejscu wyląduje nasz guzik.

https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

(77)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 77/98

Layout Manager

● GridLayout

– GridLayout ustala ten sam rozmiar dla wszystkich komponentów po czym

wrzuca je w siatkę o określonej ilości kolumn i wierszy.

http://www.thaicreate.com/java/java-gui-layout-gridlayout.html

(78)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 78/98

Layout Manager

BorderLayout

– Domyślny dla JFrame

– Możliwe składniki:

PAGE_START

LINE_START

CENTER

LINE_END

PAGE_END

– Wygodne do robienia np. menu po lewej stronie albo nagłówka i stopki.

– Nie wszystkie składniki muszą być dodane

(79)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 79/98

Layout Manager

● BorderLayout

– Wybrane składniki:

PAGE_START

LINE_START

CENTER

– Wygodne do robienia np. menu po lewej stronie i nagłówka.

– Nie wszystkie składniki muszą być dodane

(80)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Quiz time

Co to za Layout?

(81)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 81/98

1. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

Przykład kodu na

stronie przedmiotu!

(82)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 82/98

1. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

CENTER PAGE_END

Przykład kodu na

stronie przedmiotu!

(83)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 83/98

2. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

Przykład kodu na

stronie przedmiotu!

(84)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 84/98

2. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

Przykład kodu na

stronie przedmiotu!

(85)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 85/98

3. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

Przykład kodu na

stronie przedmiotu!

(86)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 86/98

3. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

PAGE_START LINE_START LINE_END

Przykład kodu na

stronie przedmiotu!

(87)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 87/98

4. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

Przykład kodu na

stronie przedmiotu!

(88)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 88/98

4. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

2 x 2

Przykład kodu na

stronie przedmiotu!

(89)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 89/98

5. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

Przykład kodu na

stronie przedmiotu!

(90)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 90/98

5. Co to za Layout?

(a) BorderLayout (b) FlowLayout (c) GridLayout

PAGE_START LINE_START

3 x 1

Przykład kodu na

stronie przedmiotu!

(91)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 91/98

Layout Manager

● W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów

Przykład kodu na

stronie przedmiotu!

(92)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 92/98

Layout Manager

● W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów

BorderLayout (górny, lewy i centrum)

+ GridLayout (po lewej) + FlowLayout (u góry)

Każdy z paneli ma swój oddzielny layout, i każdy dodany jest do okna w

innym miejscu...

(93)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 93/98

Layout Manager

● W ramach osobnych paneli można

zastosować różne typ zarządzania

rozmieszczeniem komponentów

(94)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 94/98

Layout Manager

● W ramach osobnych paneli można zastosować różne typ zarządzania rozmieszczeniem komponentów

BorderLayout +

GridLayout ( 4 x 3 ) +

GridLayout ( 5 x 1 ) +

FlowLayout

(95)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 95/98

Użycie LM

JPanel panel1 = new JPanel(new FlowLayout());

JPanel panel2 = new JPanel(new BorderLayout());

panel1.add(aComponent1);

panel2.add(aComponent2, BorderLayout.PAGE_START);

Można też dawać wskazówki co do wymiarów komponentów wywołując metody na konkretnych komponentach —

setMinimumSize, setPreferredSize, and setMaximumSize.

np.

component.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));

https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

(96)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 96/98

Rozmiary komponentów

Silnie zależą od użytego Layout Managera

(97)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 97/98

Dziękuję za Uwagę!

Do zobaczenia za tydzień.

Porozmawiamy o interfejsach i obsłudze zdarzeń.

M.in. jak oprogramować używanie guzików.

(98)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 98/98

Ciekawostki

this

(99)

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW)

Słowo kluczowe „this”

Czasem metoda obiektu potrzebuje odwołać się do obiektu wywołującego tę metodę. Umożliwia to słowo kluczowe this.

Wewnątrz metody this oznacza obiekt, na rzecz którego wywołano metodę.

W Java nie można deklarować dwóch takich samych zmiennych lokalnych w obrębie jednego zakresu, jednak istnieje możliwość przesłonięcia zmiennych instancyjnych klasy przez parametry metody. Wewnątrz metody zmienne instancyjne byłyby

niedostępne, gdyby nie możliwość użycia zmiennej this:

public class Punkt {

double x = 0 , y = 0;

Punkt (double x, double y){

this.x = x; this.y = y;

}

}

Cytaty

Powiązane dokumenty

● Definicja: paradygmat programowania opierający się na podziale kodu źródłowego programu na procedury i hierarchicznie ułożone bloki?. ● Rozwijał się w opozycji

CREATE TABLE table_name ( column1 datatype not null, column2 datatype,. column3 datatype,

public void actionPerformed(ActionEvent arg0) {  setTitle(&#34;Anonimowa klasa wewnetrzna&#34;);  . } }

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 80/116 public class MenuWindow extends JFrame {.

strumieniowych związanych z plikami podaliśmy jako argument nazwę pliku → 4 klasy strumieni abstrakcyjnych. ● można także utworzyć strumień plikowy podając jako

protected void done() - wywoływana po zakończeniu zadania, wykonywana w EDT, można w niej przeprowadzić „sprzątanie” i zaprezentować w GUI główny rezultat wykonywanego

– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna... – Ustalamy jakiego DBMS będziemy używać.

javax.sql.rowset.serial Provides utility classes to allow serializable mappings be- tween SQL types and data types in the Java programming language.. javax.sql.rowset.spi The