Main.java
package com.company;

interface Zwierzak {
    int waga = 99;      // właściwość statyczna
    void podajGatunet() ;
    default void dodatek(){
        System.out.println("-->Dodatkowa metoda");
    }
}



class Funkcja {
    static public void funkcja(Zwierzak zwierz)
    {
        zwierz.podajGatunet();
    }
}   // Argumentem funkcji jest interface, w którym najważniejsza jest funkcja

public class Main {

    public static void main(String[] args) {


        Funkcja.funkcja(new Zwierzak() {
            @Override
            public void podajGatunet() {
                System.out.println("-->Mój gatunek podany w implementacji1");
            }
        });


        Funkcja.funkcja(() -> { System.out.println("-->Mój gatunek podany w implementacji2");
            System.out.println("-->Mój gatunek podany w implementacji2");
        });



        //funkcja anonimowa
        Funkcja.funkcja(() -> System.out.println("-->Mój gatunek podany w implementacji3"));

        Zwierzak  dodatkowy = new Zwierzak() {
            @Override
            public void podajGatunet() {

            }
        };

        dodatkowy.dodatek();


    }
}