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); } }