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...

Strona główna