package com.company; abstract class Zwierzak { public int waga = 100; // właściwość public abstract void podajGatunek() ; // metoda abstrakcyjna public void metodaZwierzaka(){ System.out.println("-->Jestem nieabstrakcyjną metodą zwierzaka"); } } 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 void main(String[] args) { Zwierzak zwierzak = new Zwierzak() { @Override public void podajGatunek() { // Obiekt klasy abstrakcyjnej musi mieć // zaimplementowane wszystkie metody abstrakcyjne } }; Zwierzak kon = new Kon(); kon.podajGatunek(); new Kot().podajGatunek(); new Pies().podajGatunek(); var kocur = new Kot(); // Java 10+ kocur.podajGatunek(); // Klasa anonimowa nie ma nazwy. // Klasy anonimowe służą do tworzeniem jej jedynej instancji // Porównać co będzie jeśli zamiast var będzie Zwierzak 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"); } }; System.out.println("Nalot = " + nowyZwierz.nalot); System.out.println("Waga = " + nowyZwierz.waga); nowyZwierz.podajGatunek(); nowyZwierz.podajWysokosc(); } }