Polimorfizm

/* Polimorfizm1.java */

// Klasa obiektu, czyli inaczej typ obiektu
// określony jest przez nazwę konstruktora.

// Polimorfizm 1:
// Referencja do obiektu danej klasy może mieć typ
// danej klasy albo typ dowolnej klasy bazowej, po
// której dziedziczy dana klasa.

// Przez referencję typu klasy bazowej można odwołać
// się jedynie do zmiennych i metod określonych w klasie
// bazowej, dlatego niekiedy zachodzi potrzeba zrzutowania
// referencji typu klasy bazowej do typu klasy potomnej.

// Klasy abstrakcyjne mogą zawierać konstruktory,
// ale nie jest możliwe tworzenie obiektów klas
// abstrakcyjnych.

// Klasy abstrakcyjne mogą zawierać abstrakcyjne
// metody obiektowe, które nie mają określonych
// ciał. Klasy nieabstrakcyjne, które dziedziczą
// po klasie abstrakcyjnej muszą implementować
// wszystkie odziedziczone metody abstrakcyjne.

// Metody określone w abstrakcyjnej klasie bazowej
// można wywoływać na rzecz obiektów klas potomnych
// przez referencję, która ma typ klasy abstrakcyjnej.

abstract class Figury2D
{
  static final double PI = Math.PI;
  abstract double pole();
}

class Kolo extends Figury2D
{
  int r;

  Kolo(int r)
  {
    this.r = r;
  }

  double pole()
  {
    return PI*r*r;
  }
}

class Prostokat extends Figury2D
{
  int a;
  int b;

  Prostokat(int a, int b)
  {
    this.a = a;
    this.b = b;
  }

  double pole()
  {
    return a*b;
  }
}

public class Polimorfizm1
{
  public static void main(String[] args)
  {
    Figury2D[] figury = {new Kolo(3), new Prostokat(4,5)};
    System.out.println("Pole kola = " + figury[0].pole());
    System.out.println("Pole prostokata = " + figury[1].pole());
  }
}
Pole kola = 28.274333882308138
Pole prostokata = 20.0
Press any key to continue...
/* Polimorfizm2.java */

// Klasa obiektu, czyli inaczej typ obiektu
// określony jest przez nazwę konstruktora.

// Polimorfizm 2:
// Referencja do obiektu danej klasy może mieć typ
// danej klasy albo typ dowolnej klasy bazowej, po
// której dziedziczy dana klasa albo typ dowolnego
// interfejsu, który implementuje dana klasa. Jeśli
// dana klasa implementuje interfejs, to implementuje
// go również każda klasa potomna danej klasy.

// Przez referencję do obiektu, która ma typ danego
// interfejsu, można wywołać tylko te metody, które
// zostały określone w danym interfejsie oraz metody
// z klasy Object, dlatego niekiedy zachodzi potrzeba
// zrzutowania referencji typu danego interfejsu do
// referencji typu odpowiedniej klasy.

// Interfejsy mogą zawierać jedynie publiczne stałe
// i publiczne abstrakcyjne metody obiektowe. Klasa
// nieabstrakcyjna, która implementuje dany interfejs
// musi podać pełną implementację wszystkich jego metod.

// Interfejsy mogą zawierać również klasy wewnętrzne
// (ang. nested class) oraz interfejsy wewnętrzne
// (ang. nested interface).

interface Miary
{
  double PI = Math.PI; // <=> public static final double PI = Math.PI;
  double pole();       // <=> public abstract double pole();
}

class Kolo implements Miary
{
  int r;

  Kolo(int r)
  {
    this.r = r;
  }

  public double pole()
  {
    return PI*r*r;
  }
}

class Kula implements Miary
{
  int r;

  Kula(int r)
  {
    this.r = r;
  }

  public double pole()
  {
    return 4*PI*r*r;
  }
}

public class Polimorfizm2
{
  public static void main(String[] args)
  {
    Miary[] figury = {new Kolo(3), new Kula(5)};
    System.out.println("Pole kola = " + figury[0].pole());
    System.out.println("Pole kuli = " + figury[1].pole());
  }
}
Pole kola = 28.274333882308138
Pole kuli = 314.1592653589793
Press any key to continue...
/* Polimorfizm3.java */

// Klasa obiektu, czyli inaczej typ obiektu
// określony jest przez nazwę konstruktora.

// Polimorfizm 3:
// Referencja do obiektu danej klasy może mieć typ
// danej klasy albo typ dowolnej klasy bazowej, po
// której dziedziczy dana klasa albo typ dowolnego
// interfejsu, który implementuje dana klasa albo
// typ dowolnego interfejsu, po którym dziedziczy
// interfejs, który implementuje dana klasa. Jeśli
// dana klasa implementuje interfejs, to implementuje
// go również każda klasa potomna danej klasy.

// Klasa może implementować kilka interfejsów
// jednocześnie. Interfejsy mogą dziedziczyć
// po sobie. W odniesieniu do interfejsów nie
// obowiązuje model jednokrotnego dziedziczenia.
// Innymi słowy, każdy interfejs może mieć wiele
// interfejsów nadrzędnych.

// Przez referencję do obiektu, która ma typ danego
// interfejsu, można wywołać tylko te metody, które
// zostały określone w danym interfejsie oraz metody
// z klasy Object, dlatego niekiedy zachodzi potrzeba
// zrzutowania referencji typu danego interfejsu do
// referencji typu odpowiedniej klasy lub interfejsu.

interface Miary2D
{
  double PI = Math.PI; // <=> public static final double PI = Math.PI;
  double pole();       // <=> public abstract double pole();
}

interface Miary3D extends Miary2D
{
  double objetosc(); // <=> public abstract double objetosc();
}

class Kolo implements Miary2D
{
  int r;

  Kolo(int r)
  {
    this.r = r;
  }

  public double pole()
  {
    return PI*r*r;
  }
}

class Kula implements Miary3D
{
  int r;

  Kula(int r)
  {
    this.r = r;
  }

  public double pole()
  {
    return PI*r*r;
  }

  public double objetosc()
  {
    return 4/3.0*PI*r*r*r;
  }
}

public class Polimorfizm3
{
  public static void main(String[] args)
  {
    Miary2D[] figury1 = {new Kolo(2), new Kula(5)};
    System.out.println("Pole kola = " + figury1[0].pole());
    System.out.println("Pole kuli = " + figury1[1].pole());

    System.out.println();

    Miary3D[] figury2 = {new Kula(2), new Kula(5)};
    System.out.println("Pole kuli 1 = " + figury2[0].pole());
    System.out.println("Pole kuli 2 = " + figury2[1].pole());
    System.out.println("Objetosc kuli 1 = " + figury2[0].objetosc());
    System.out.println("Objetosc kuli 2 = " + figury2[1].objetosc());
  }
}
Pole kola = 12.566370614359172
Pole kuli = 78.53981633974483

Pole kuli 1 = 12.566370614359172
Pole kuli 2 = 78.53981633974483
Objetosc kuli 1 = 33.510321638291124
Objetosc kuli 2 = 523.5987755982989
Press any key to continue...

Strona główna