Dlaczego plik Java ma taką samą nazwę jak jego klasa publiczna? [duplikować]

Możliwy duplikat:
Dlaczego nazwa pliku w java powinna być taka sama jak nazwa klasy?

Mam jeden plik o nazwietemp.java. Napisałem następujący kod. Dlaczego to działa?

class demo //not public keyword and not same as filename
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}

Dlaczego to nie działa?

public class demo
{
    public static void main(String []args)
    {
        System.out.println("this is Main method");
    }
}