Instanțierea clasei care conține metoda main

Clasa care conține metoda main este clasa principală a unei aplicații, deci este prima clasă care se încarcă în mașina virtuală Java la punerea în execuție a aplicației respective. În același timp, ea este o clasă ca oricare alta, care poate avea și instanțe. Metoda main(), fiind statică, nu poate utiliza direct decât câmpurile statice și metodele statice ale acestei clase. Totuși, în metoda main() sau în alte metode, pot fi create instanțe ale acestei clase, putându-se astfel utiliza și câmpurile și metodele de instanță ale acestora.
 
Exemplu
În fișierul Aplic.java este dat un exemplu de aplicație, în care clasa Aplic, care conține metoda main(), are câmpuri și metode statice și de instanță și constructor. 
 
/* O clasa care contine metoda main() si poate fi instantiata */

class Aplic {
  static int a=10; // un camp static (al clasei)
  double b;  // camp al instantei
  String s;  // camp al instantei

  Aplic(double b, String s) { // constructorul clasei Aplic
    this.b=b; this.s=s;
  }

  double f1(double x) { // o metoda (functie) de instanta
    return a*b+1; // se utilizeaza campul static si cel de instanta
  }

  static int f2(int m) { // o metoda (functie) statica
    return m+a; // se utilizeaza numai campul static
  }

  public static void main(String args[]) {
    String s0="sir implicit 0", s1="sir implicit 1";
    Aplic a0, a1; // Doua referinte la instante ale clasei Aplic
    if(args.length>=1) s0=args[0];
    if(args.length>=2) s1=args[1];
    /* Se creaza doua instante ale clasei Aplic */
    a0=new Aplic(12.47, s0);
    a1=new Aplic(-15.28, s1);
    /* Campul static a si metoda statica f2 pot fi utilizate direct,
       sau calificandu-le cu numele clasei sau cu referinta la o 
       instanta
    */
    System.out.println("a="+a+" Aplic.a="+Aplic.a+" a0.a="+a0.a+
      " a1.a="+a1.a);
    System.out.println("f2(2)="+f2(2)+" Aplic.f2(2)="+Aplic.f2(2)+
      " a0.f2(2)="+a0.f2(2)+" a1.f2(2)="+a1.f2(2));
    /* Campurile si metodele de instanta se folosesc prin intermediul
       referintelor la instantele respective
    */
    System.out.println("a0.b="+a0.b+" a0.s="+a0.s);
    System.out.println("a1.b="+a1.b+" a1.s="+a1.s);
    System.out.println("a0.f1(1.5)="+a0.f1(1.5)+
      " a1.f1(1.5)="+a1.f1(1.5));
    /* Modificam campul static a si il afisam in diferite moduri */
    a=20;
    System.out.println("Dupa modificari:");
    System.out.println("a="+a+" Aplic.a="+Aplic.a+" a0.a="+a0.a+
      " a1.a="+a1.a);
    /* Modificam campul b din fiecare instanta si afisam */
    a0.b=32.5; a1.b=-121.8;
    System.out.println("a0.b="+a0.b+" a1.b="+a1.b);
  }
}

Remarcăm urmatoarele:
  - clasa Aplic are câmpuri statice și de instanță și alte metode statice și de instanță, pe lângă metoda main();
  - clasa Aplic are și un constructor (putea avea chiar mai mulți, sau numai pe cel implicit);
  - în metoda main() se creează două instanțe ale clasei Aplic, cu referințele a0 și a1;
  - în metodele statice main()și f2(), câmpul static a și metoda statica f2() pot fi utilizate direct, sau calificându-le cu numele clasei sau cu o referință la o instanță a acesteia. În toate cazurile se obtine același rezultat;
  - câmpurile și metodele de instanță nu pot fi utilizate direct în metoda statică main(), dar pot fi utilizate cele ale instanțelor, calificandu-le cu referințele la aceste instanțe, de exemplu a0.b sau a0.f1(1.5);
  - în metodele de instanță pot fi utilizate direct atât câmpurile clasei, cât și ale instanței. Astfel, în metoda de instanță f1() se folosește expresia a*b+1, în care apar câmpul static a și câmpul de instanță b.



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați