„Profesorul pur și simplu nu poate ieși din rutina lui. Profesorii vechi care sunt obișnuiți să predea sunt întotdeauna așa. Nu e nimic din ce să-ți spună pe care să nu-l poți găsi în cărți. Nu înveți să înoți ascultând . la cursurile de înot. Prelegerile sunt utile numai atunci când ești familiarizat cu subiectul și știi aproape la fel de multe ca profesorul tău."

— Totuși, lecțiile lui sunt utile.

„Da. Adică, sperăm să fie. Cu cât auziți mai multe perspective asupra subiectului, cu atât vă veți apropia mai mult de adevăr. Când auzi doar unul, tot ce poți face este să crezi sau să nu-l crezi. OK, haideți. întoarce-te la afaceri.”

— Să ne uităm la o poză pe care ți-am arătat-o ​​înainte.


public class Variables

{
   private static String TEXT = "The end.";
  ┗━━━━━━━━━━━━━━━━━━━┛
   public static void main (String[] args)
                          ┗━━━━━━━┛
  {
     System.out.println("Hi");
     String s = "Hi!";
   ┏┗━━━━┛
    System.out.println(s);
    if (args != NULL)
    {
       String s2 = s;
      ┗━━━━┛
   
      System.out.println(s2);
     
    }
    Variables variables = new Variables();
    System.out.println(variables.instanceVariable);
    System.out.println(TEXT);
   
  }
 
   public String instanceVariable;
  ┗━━━━━━━━━━━━━━━┛
   public Variables()
   {
      instanceVariable = "Instance variable test.";
   }
}

1. O variabilă declarată într-o metodă există (este vizibilă) de la începutul declarației sale până la sfârșitul metodei.

2. O variabilă declarată într-un bloc de cod există până la sfârșitul blocului de cod.

3. Parametrii unei metode există până când metoda revine.

4. Variabilele dintr-un obiect există pe toată durata de viață a obiectului care le conține. Vizibilitatea lor este, de asemenea, guvernată de modificatori speciali de acces.

5. Variabilele statice (clasă) există tot timpul în care programul rulează. Vizibilitatea lor este definită și de modificatorii de acces.”

— Corect. Îmi amintesc poza asta.

„Genial. Permiteți-mi să vă reamintesc câteva puncte cheie.”

„Toate variabilele declarate în cadrul metodelor există (sunt vizibile) din punctul în care sunt declarate până la sfârșitul metodei (Exemplu 1).”

„Dacă o variabilă este declarată într-un bloc de cod, aceasta există până la sfârșitul blocului de cod (Exemplul 2).”

„Dacă o variabilă este un parametru al unei metode, aceasta există (este vizibilă) în întregul corp al metodei (exemplul 3).”

„Dacă o variabilă este o variabilă de instanță (Exemplul 4), este legată de un anumit obiect și există atâta timp cât obiectul există. Dacă nu există niciun obiect, atunci nu există instanțe ale variabilei. Puteți accesa variabila (adică variabila este vizibilă) din toate metodele clasei, indiferent dacă au fost declarate înainte sau după ea. Pentru fiecare obiect este creată o nouă variabilă. Este independentă de alte obiecte. Nu puteți accesa o variabilă de instanță din metode statice . "

„Dacă o variabilă este declarată statică, adică marcată cu cuvântul cheie static , ea există atâta timp cât există clasa sa. JVM-ul încarcă de obicei o clasă în memorie la prima utilizare. Tot atunci sunt inițializate variabilele statice.”

Mai multe despre domeniul variabil - 1

„Exemplul de mai sus declară clasa Cat, care are patru variabile: a, b, s (variabile non-statice) și count (o variabilă statică). Dacă creăm mai multe obiecte din această clasă (să zicem, trei), fiecare dintre ele vor conține propriile instanțe ale variabilelor nestatice ale clasei. O variabilă statică este partajată de toate obiectele unei clase. Tehnic vorbind, nici măcar nu se află în interiorul acestor obiecte, deoarece a existat chiar înainte ca orice obiect Cat să fie creat."

„Iată ce se întâmplă dacă declarăm variabila sstatică:”

Mai multe despre domeniul variabil - 2

"OK. Cred că am înțeles."

„Poți declara variabile cu același nume?”

"Nu în interiorul unei metode. Toate variabilele declarate în interiorul unei metode trebuie să aibă nume unice. Argumentele unei metode sunt, de asemenea, considerate variabile locale."

„Dar variabilele membre?”

„Variabilele membrilor trebuie să fie, de asemenea, unice pentru fiecare clasă.”

„Dar există o excepție: numele variabilelor locale și ale variabilelor membre pot fi identice.

„Dacă modificăm o astfel de variabilă, care dintre cele două variabile cu nume identic va fi schimbată?”

"If there are several visible (accessible) variables in our code – say, an instance variable and a local variable – the local variable will be accessed."

Example with two count variables
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

"This code declares two count variables. Line 3 declares an instance variable, and line 8 – a local variable."

"Here's what happens when the run method is executed:"

"In line 7, we access the instance variable and assign the value 15 to it"

"In line 8, we declare (create) a new local variable: count. It masks the instance variable. The local variable is what all subsequent code in the method will see (access)."

"Got it."

"Variabila locală maschează variabila instanță. Cu alte cuvinte, variabila locală este cea care trebuie accesată. Totuși, puteți accesa și variabila instanță. Este puțin mai complicat să faceți acest lucru."

Variabilă statică (clasă).
ClassName.variableName

// Here are some examples:
Cat.catsCount
Variabilă (instanță) nestatică
this.variableName

// Here are some examples:
this.catsCount

„Ce altceva îmi puteți spune despre metodele statice și variabilele statice?”

„Metodele și variabilele statice nu sunt legate de obiecte ale clasei; sunt legate de clasa în sine. Dacă creăm zece obiecte Variables (vezi exemplul de la începutul acestui nivel), vom avea zece variabile instanceVariable (una pentru fiecare). obiect) și o singură variabilă partajată (statică) TEXT ."

"Am o întrebare."

„Care este diferența dintre metodele statice și non-statice?”

„Să aruncăm o privire la modul în care funcționează o metodă non-statică:”

Cum arată codul
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Ce se întâmplă cu adevărat
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

„Când apelați o metodă folosind <obiect> punct <numele metodei> , de fapt apelați o metodă de clasă și treceți același obiect ca primul argument. În interiorul metodei, obiectul se numește „this” . Toate operațiunile din metoda sunt efectuate asupra acestui obiect și a datelor sale.”

"Wow! Deci așa funcționează totul!"

„Și așa funcționează o metodă statică”.

Cum arată codul
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Ce se întâmplă cu adevărat
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"When you call a static method, no object is passed to it. In other words, 'this' equals null. That's why a static method can't access non-static variables and methods (since it has no 'this' to pass to these methods)."

"Hmmm. I think I get it. At least a little bit."

"And here comes Uncle Diego... and his tasks."