"Professorn kan bara inte ta sig ur sitt hjulspår. Gamla lärare som är vana vid att föreläsa är alltid så här. Det finns inget han kan berätta för dig som du inte kan hitta i böcker. Du lär dig inte simma genom att lyssna till simföreläsningar. Föreläsningar är bara användbara när du är bekant med ämnet och kan nästan lika mycket som din professor."

"Ändå är hans lärdomar användbara."

"Japp. Jag menar, vi hoppas att de är det. Ju fler perspektiv på ämnet du hör, desto närmare kommer du sanningen. När du bara hör en, kan du bara tro det eller inte tro det. OK, låt oss komma tillbaka till verksamheten."

"Låt oss titta på en bild som jag har visat dig förut."

┏
┃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. En variabel som deklareras i en metod finns (är synlig) från början av dess deklaration till slutet av metoden.

2. En variabel deklarerad i ett kodblock existerar till slutet av kodblocket.

3. En metods parametrar existerar tills metoden återkommer.

4. Variabler i ett objekt existerar under hela livslängden för det objekt som innehåller dem. Deras synlighet styrs också av särskilda åtkomstmodifierare.

5. Statiska (klass)variabler existerar hela tiden programmet körs. Deras synlighet definieras också av åtkomstmodifierare."

"Jaha. Jag kommer ihåg den här bilden."

"Bra. Låt mig påminna dig om några viktiga punkter."

"Alla variabler som deklareras i metoder existerar (är synliga) från den punkt där de deklareras till slutet av metoden (exempel 1)."

"Om en variabel deklareras i ett kodblock, existerar den till slutet av kodblocket (exempel 2)."

"Om en variabel är en metodparameter, finns den (är synlig) i hela metoden (exempel 3)."

"Om en variabel är en instansvariabel (Exempel 4) är den kopplad till ett visst objekt och existerar så länge objektet existerar. Om inget objekt existerar så finns det inga instanser av variabeln. Du kan komma åt variabeln (dvs. variabeln är synlig) från alla metoder i klassen, oavsett om de deklarerades före eller efter den. En ny variabel skapas för varje objekt. Den är oberoende av andra objekt. Du kan inte komma åt en instansvariabel från statiska metoder . "

"Om en variabel deklareras statisk, dvs. markerad med nyckelordet static , existerar den så länge dess klass existerar. JVM laddar vanligtvis en klass i minnet vid första användningen. Det är också då statiska variabler initieras."

Mer om variabelt omfattning - 1

"Exemplet ovan deklarerar Cat-klassen, som har fyra variabler: a, b, s (icke-statiska variabler) och count (en statisk variabel). Om vi ​​skapar flera objekt av den här klassen (säg tre), vart och ett av de kommer att innehålla sina egna instanser av klassens icke-statiska variabler. En statisk variabel delas av alla objekt i en klass. Tekniskt sett finns den inte ens inuti dessa objekt, eftersom den fanns redan innan några Cat-objekt skapades."

"Här är vad som händer om vi deklarerar variabel sstatisk:"

Mer om variabelt omfattning - 2

"Okej. Jag tror jag förstår."

"Kan du deklarera variabler med samma namn?"

"Inte i en metod. Alla variabler som deklareras inuti en metod måste ha unika namn. En metods argument anses också vara lokala variabler."

"Hur är det med medlemsvariabler?"

"Medlemsvariabler måste också vara unika för varje klass."

"Men det finns ett undantag: namnen på lokala variabler och medlemsvariabler kan vara identiska. "

"Om vi ​​ändrar en sådan variabel, vilken av de två identiskt namngivna variablerna kommer att ändras?"

"Om det finns flera synliga (tillgängliga) variabler i vår kod - säg en instansvariabel och en lokal variabel - kommer den lokala variabeln att nås."

Exempel med två räknevariabler
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
    }
}

"Den här koden deklarerar två räkningsvariabler. Rad 3 deklarerar en instansvariabel och rad 8 - en lokal variabel ."

"Här är vad som händer när körningsmetoden körs:"

"På rad 7 kommer vi åt instansvariabeln och tilldelar den värdet 15"

"På rad 8 deklarerar (skapar) vi en ny lokal variabel : count. Den maskerar instansvariabeln. Den lokala variabeln är vad all efterföljande kod i metoden kommer att se (åtkomst)."

"Jag fattar."

"Den lokala variabeln maskerar instansvariabeln. Med andra ord är den lokala variabeln den som ska nås. Du kan dock komma åt instansvariabeln också. Det är bara lite mer komplicerat att göra det."

Statisk (klass) variabel
ClassName.variableName

// Here are some examples:
Cat.catsCount
Icke-statisk (instans) variabel
this.variableName

// Here are some examples:
this.catsCount

"Vad mer kan du berätta om statiska metoder och statiska variabler?"

"Statiska metoder och variabler är inte länkade till objekt i klassen, de är länkade till själva klassen. Om vi ​​skapar tio Variables- objekt (se exemplet i början av denna nivå), kommer vi att ha tio instansVariable -variabler (en för varje objekt) och endast en delad (statisk) variabel TEXT ."

"Jag har en fråga."

"Vad är skillnaden mellan statiska och icke-statiska metoder?"

"Låt oss ta en titt på hur en icke-statisk metod fungerar:"

Hur koden ser ut
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Vad händer egentligen
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"När du anropar en metod med <objekt> punkt <metodnamn> anropar du faktiskt en klassmetod och skickar samma objekt som det första argumentet. Inuti metoden kallas objektet 'detta' . Alla operationer i metod utförs på detta objekt och dess data."

"Wow! Så det är så det fungerar!"

"Och det är så här en statisk metod fungerar."

Hur koden ser ut
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Vad händer egentligen
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"När du anropar en statisk metod skickas inget objekt till den. Med andra ord, "detta" är lika med null . Det är därför en statisk metod inte kan komma åt icke-statiska variabler och metoder (eftersom den inte har något " detta" att passera till dessa metoder)."

"Hmmm. Jag tror jag förstår. I alla fall lite."

"Och här kommer farbror Diego... och hans uppgifter."