Il significato di static

Il fatto che il metodo main e' statico, genera di solito dei problemi per i principianti che ancora non capiscono bene il significato della dichiarazione static. Ecco un tipico caso di programma che genera,quando viene compilato, un misterioso errore sul fatto che non potete accedere in un metodo statico a una variabile non statica.
public class temp
{
   int MyArr [] = new int[4];
   public static void main(String args[])
   {
    for(byte i=0;i<4;i++)
    {
     MyArr[i] = 2*i;
     System.out.println(MyArr[i]);
    }
   }
}   
Potete risolvere il problema in 2 modi:
  1. Rendendo la variabile MyArr anch'essa statica.Ma allora, fate attenzione, perche' essa verra' creata in un'unica copia ,anche se instanziate piu' oggetti della classe temp.
    public class temp
    {
       static int MyArr [] = new int[4];
       public static void main(String args[])
       {
        for(byte i=0;i<4;i++)
        {
         MyArr[i] = 2*i;
         System.out.println(MyArr[i]);
        }
       }
    }   
    
  2. Invece questa e' la soluzione piu' corretta,anche se per il principiante e' sorprendente:instanziate l'oggetto contenente il metodo main!
    public class temp1
    {
       int MyArr [] = new int[4];
       public static void main(String args[])
       {
        temp1 a = new temp1();
        for(byte i=0;i<4;i++)
        {
         a.MyArr[i] = 2*i;
         System.out.println(a.MyArr[i]);
        }
       }
    }