Programy obiektowe
/* Prostokat1.java */
// Jeśli w ciele klasy konstruktor nie zostanie podany
// w sposób jawny, to kompilator wstawi konstruktor
// domyślny postaci NazwaKlasy() {}
// W momencie tworzenia nowego obiektu danej klasy,
// zmienne obiektowe i metody obiektowe określone
// w danej klasie są kopiowane do tworzonego obiektu.
// Aby wywołać metodę obiektową musi istnieć obiekt,
// w stosunku do którego ta metoda zostanie wywołana.
// Metody obiektowe danego obiektu wywołujemy przez
// referencję do tego obiektu.
// Aby odczytać lub zapisać zmienną obiektową musi
// istnieć obiekt, w stosunku do którego zostanie
// wykonana operacja odczytu lub zapisu. Odwołanie
// do zmiennych obiektowych danego obiektu uzyskujemy
// przez referencję do tego obiektu.
// W poniższym programie referencja do obiektu ma typ obiektu.
// Typ obiektu określony jest przez nazwę konstruktora.
// Metody obiektowe określone w danej klasie mają bezpośredni
// dostęp do zmiennych statycznych i obiektowych oraz metod
// statycznych oraz innych metod obiektowych danej klasy.
class Prostokat
{
int a; // zmienne obiektowe
int b;
// Prostokat() {} // konstruktor domyślny
int pole() // metoda obiektowa
{
return a * b;
}
}
public class Prostokat1
{
public static void main(String[] args)
{
Prostokat pr1 = new Prostokat();
pr1.a = 2;
pr1.b = 3;
System.out.println("Prostokat 1");
System.out.println("a = " + pr1.a);
System.out.println("b = " + pr1.b);
System.out.println("Pole pr1 = " + pr1.pole());
}
}
Prostokat 1
a = 2
b = 3
Pole pr1 = 6
Press any key to continue...
/* Prostokat2.java */
// Konstruktor inicjuje obiekty po ich utworzeniu.
// Konstruktor ma zawsze taką samą nazwę jak klasa,
// w której się znajduje.
// W momencie tworzenia nowego obiektu danej klasy,
// zmienne obiektowe i metody obiektowe określone
// w danej klasie są kopiowane do tworzonego obiektu.
// Zatem każdy obiekt ma własny zestaw zmiennych
// obiektowych i metod obiektowych, a dostęp do nich
// uzyskujemy przez referencję do obiektu.
class Prostokat
{
int a; // zmienne obiektowe
int b;
Prostokat(int x, int y) // konstruktor
{
a = x;
b = y;
}
int pole() // metoda obiektowa
{
return a * b;
}
}
public class Prostokat2
{
public static void main(String[] args)
{
Prostokat pr1 = new Prostokat(2,3);
Prostokat pr2 = new Prostokat(4,5);
System.out.println("Prostokat 1");
System.out.println("a = " + pr1.a);
System.out.println("b = " + pr1.b);
System.out.println("Prostokat 2");
System.out.println("a = " + pr2.a);
System.out.println("b = " + pr2.b);
System.out.println("Pole pr1 = " + pr1.pole());
System.out.println("Pole pr2 = " + pr2.pole());
}
}
Prostokat 1
a = 2
b = 3
Prostokat 2
a = 4
b = 5
Pole pr1 = 6
Pole pr2 = 20
Press any key to continue...
/* Prostokat3.java */
// Dostęp do zmiennych i metod z modyfikatorem private,
// określonych w danej klasie, mają tylko metody z danej klasy.
// Zmienne statyczne są związane z klasą a nie z obiektami,
// dlatego zmienna statyczna określona w danej klasie ma
// taką samą wartość dla wszystkich obiektów danej klasy.
class Prostokat
{
private int a; // zmienne obiektowe
private int b;
private int numer;
private static int ile; // zmienna klasy (statyczna)
Prostokat(int x, int y) // konstruktor
{
ile++;
numer = ile;
a = x;
b = y;
}
int pole() // metoda obiektowa
{
return a * b;
}
void opis() // metoda obiektowa
{
System.out.println("Prostokat " + numer);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
public class Prostokat3
{
public static void main(String[] args)
{
Prostokat pr1 = new Prostokat(2,3);
Prostokat pr2 = new Prostokat(4,5);
pr1.opis();
pr2.opis();
System.out.println("Pole pr1 = " + pr1.pole());
System.out.println("Pole pr2 = " + pr2.pole());
}
}
Prostokat 1
a = 2
b = 3
Prostokat 2
a = 4
b = 5
Pole pr1 = 6
Pole pr2 = 20
Press any key to continue...
/* Prostokat4.java */
// Aby wywołać metodę obiektową musi istnieć obiekt,
// w stosunku do którego ta metoda zostanie wywołana.
// Metody obiektowe danego obiektu wywołujemy przez
// referencję do tego obiektu. Przy czym, metody
// obiektowe, określone w danej klasie, mogą się
// odwoływać do innych metod z danej klasy, tak jak
// to ma miejsce w przypadku metody wypiszPole().
// Należy rozumieć, że bezpośrednie odwołanie z danej
// metody obiektowej do innej metody obiektowej odbywa
// się zawsze w obrębie tego samego obiektu, czyli tego,
// w stosunku do którego została wywołana dana metoda.
// Innymi słowy, jest to odwołanie przez referencję this.
// Referencja this omówiona jest w kolejnym programie.
class Prostokat
{
private int a;
private int b;
private int numer;
private static int ile;
Prostokat(int x, int y)
{
ile++;
numer = ile;
a = x;
b = y;
}
int pole()
{
return a * b;
}
void opis()
{
System.out.println("Prostokat " + numer);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
void wypiszPole()
{
System.out.println("Pole pr" + numer + " = " + pole());
// <=> System.out.println("Pole pr" + numer + " = " + this.pole());
}
}
public class Prostokat4
{
public static void main(String[] args)
{
Prostokat pr1 = new Prostokat(2,3);
Prostokat pr2 = new Prostokat(4,5);
pr1.opis();
pr2.opis();
pr1.wypiszPole();
pr2.wypiszPole();
}
}
Prostokat 1
a = 2
b = 3
Prostokat 2
a = 4
b = 5
Pole pr1 = 6
Pole pr2 = 20
Press any key to continue...
/* Prostokat5.java */
// Metody statyczne określone w danej klasie mają bezpośredni
// dostęp tylko do zmiennych statycznych i metod statycznych
// danej klasy. Zatem metody statyczne mogą się odwoływać do
// zmiennych i metod obiektowych jedynie przez referencję do
// obiektu, ale nie może to być referencja this.
// Słowo kluczowe this oznacza referencję do bieżącego obiektu.
// Jeśli słowo kluczowe this znajduje się w ciele konstruktora,
// to reprezentuje ono referencję do obiektu, który został właśnie
// utworzony przy pomocy konstruktora. Jeśli słowo kluczowe this
// znajduje się w ciele danej metody, to reprezentuje ono referencję
// do obiektu, w stosunku do którego została wywołana dana metoda.
// Przy pomocy słowa kluczowe this możemy np. wyeliminować konflikt
// między zmiennymi obiektowymi a parametrami formalnymi metod lub
// konstruktorów.
class Prostokat
{
private int a;
private int b;
private int numer;
private static int ile;
Prostokat(int a, int b)
{
ile++;
numer = ile;
this.a = a; // this - referencja do bieżącego obiektu
this.b = b;
}
int pole()
{
return a * b;
}
void opis()
{
System.out.println("Prostokat " + numer);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static void wypiszPole(Prostokat pr)
{
System.out.println("Pole pr" + pr.numer + " = " + pr.pole());
}
}
public class Prostokat5
{
public static void main(String[] args)
{
Prostokat pr1 = new Prostokat(2,3);
Prostokat pr2 = new Prostokat(4,5);
pr1.opis();
pr2.opis();
Prostokat.wypiszPole(pr1);
Prostokat.wypiszPole(pr2);
}
}
Prostokat 1
a = 2
b = 3
Prostokat 2
a = 4
b = 5
Pole pr1 = 6
Pole pr2 = 20
Press any key to continue...
/* Prostokat6.java */
// przeciążanie metod i konstruktorów
// Klasa może zawierać metody lub konstruktory,
// które mają taką samą nazwę, ale różnią się
// typem lub ilością parametrów przekazywanych
// do ciała metody lub konstruktora.
// Sygnatura metody to jej nazwa i ciąg typów
// parametrów przekazywanych do metody. Klasa
// nie może zawierać dwóch metod, które mają
// takie same sygnatury a różnią się typem
// wartości zwracanych przez te metody.
class Prostokat
{
private int a;
private int b;
private int numer;
private static int ile;
Prostokat(int a)
{
this(a,a); // wywołanie konstruktora dwuparametrowego
}
Prostokat(int a, int b)
{
ile++;
numer = ile;
this.a = a;
this.b = b;
}
int pole()
{
return a * b;
}
int pole(int skala) // pole prostokąta w skali
{
return skala * skala * pole();
}
void opis()
{
System.out.println("Prostokat " + numer + ".");
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static void wypiszPole(Prostokat pr)
{
System.out.println("Pole pr" + pr.numer + " = " + pr.pole());
}
}
public class Prostokat6
{
public static void main(String[] args)
{
Prostokat pr1 = new Prostokat(2);
Prostokat pr2 = new Prostokat(2,3);
pr1.opis();
pr2.opis();
System.out.println("Pole pr1 w skali 1 = " + pr1.pole());
System.out.println("Pole pr2 w skali 2 = " + pr2.pole(2));
}
}
Prostokat 1.
a = 2
b = 2
Prostokat 2.
a = 2
b = 3
Pole pr1 w skali 1 = 4
Pole pr2 w skali 2 = 24
Press any key to continue...