Main.java
package com.company;

abstract class Zwierzak {
    public int waga = 100;                // właściwość
    public static int poglowie = 0;       // właściwość statyczna

    public Zwierzak() {
        Zwierzak.poglowie = Zwierzak.poglowie + 1;
        System.out.println("Dodałem zwierzaka. Teraz jest ich " + Zwierzak.poglowie);
    }
    public void destroy(){
        Zwierzak.poglowie = Zwierzak.poglowie - 1;
        System.out.println("Usunąłem zwierzaka. Teraz jest ich " + Zwierzak.poglowie);
    }

    public abstract void podajGatunek() ;
}

class Kon extends Zwierzak {
    @Override
    public void podajGatunek() {
        System.out.println("-->Mój gatunek koń");
    }
}

class Kot extends Zwierzak {
    @Override
    public void podajGatunek() {
        System.out.println("-->Mój gatunek kot");
    }
}

class Pies extends Zwierzak {
    @Override
    public void podajGatunek() {
        System.out.println("-->Mój gatunek pies");
    }
}

public class Main {

    public static <waga> void main(String[] args) {
        Zwierzak zwierzak, kon, kot, pies;


        kon = new Kon();
        kon.podajGatunek();
        System.out.println("Pogłowie = " + Zwierzak.poglowie);

        new Kot().podajGatunek();
        System.out.println("Pogłowie = " + Zwierzak.poglowie);
        new Pies().podajGatunek();
        System.out.println("Pogłowie = " + Zwierzak.poglowie);

        var kocur = new Kot();  // Java 10+
        kocur.podajGatunek();
        System.out.println("Pogłowie = " + Zwierzak.poglowie);

        // Klasa anonimowa nie ma nazwy.
        // Klasy anonimowe służą do tworzenia jedynej instancji danej klasy
        // Porównać co będzie jeśli zamiast var będzie Zwierzak (widoczność metod i właściwości)

        var nowyZwierz = new Zwierzak() {
            public int nalot = 123;
            @Override
            public void podajGatunek() {
                System.out.println("-->Mój gatunek anonimowy, nie jestem już klasy Zwierzak, ani żadnej innej nazwanej klasy");
            }
            public void podajWysokosc(){
                System.out.println("-->Mam wysokość jaką mam");
            }
        };

        nowyZwierz.podajGatunek();
        System.out.println("Pogłowie = " + Zwierzak.poglowie);

        nowyZwierz.destroy();
        nowyZwierz = null;
        System.out.println("Pogłowie = " + Zwierzak.poglowie);

    }
}