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