```
class test
{
        public static void main(String[] args)
        {
                System.out.println("Start");
                MyClass myClass = new MyClass();
                myClass.runFunc();
                System.out.println("End");
        }
}

class MyClass
{
        public void hello()
        {
                System.out.println("Hello");
        }
        public void runFunc()
        {
                Runnable run = this::hello;
                new Thread(run).start();
        }
}

```

Here `hello` is a member function of MyClass not an instance of any class which implements `Runnble`. But still the assignment `Runnable run = this::hello;` doesn't fail and the `hello` functions is getting executed in the context of the a new thread.

I know a `Runnable` can can be also initialized with a lambda expression but it's not the case here either.

I am new to Java. Can somebody please explain how this is working and what is the logic behind this behavior.