"Professoren kan bare ikke komme ud af sit spor. Gamle lærere, der er vant til at holde foredrag, er altid sådan her. Der er intet, han kan fortælle dig, som du ikke kan finde i bøger. Du lærer ikke at svømme ved at lytte til svømmeforelæsninger. Forelæsninger er kun nyttige, når du er fortrolig med emnet og ved næsten lige så meget som din professor."

"Alligevel er hans lektioner nyttige."

"Jep. Jeg mener, det håber vi, de er. Jo flere perspektiver på emnet du hører, jo tættere kommer du på sandheden. Når du hører kun én, kan du kun tro på det eller ikke tro det. OK, lad os komme tilbage til erhvervslivet."

"Lad os se på et billede, jeg har vist dig før."

┏
┃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 erklæret i en metode eksisterer (er synlig) fra starten af ​​dens erklæring til slutningen af ​​metoden.

2. En variabel erklæret i en kodeblok eksisterer indtil slutningen af ​​kodeblokken.

3. En metodes parametre eksisterer, indtil metoden vender tilbage.

4. Variabler i et objekt eksisterer i hele levetiden af ​​det objekt, der indeholder dem. Deres synlighed er også styret af særlige adgangsmodifikatorer.

5. Statiske (klasse) variabler eksisterer hele tiden programmet kører. Deres synlighed er også defineret af adgangsmodifikatorer."

"Godt. Jeg kan huske dette billede."

"Fantastisk. Lad mig minde dig om nogle nøglepunkter."

"Alle variabler, der er erklæret i metoder, eksisterer (er synlige) fra det punkt, hvor de er erklæret, indtil slutningen af ​​metoden (eksempel 1)."

"Hvis en variabel er erklæret i en kodeblok, eksisterer den indtil slutningen af ​​kodeblokken (eksempel 2)."

"Hvis en variabel er en metodeparameter, findes den (er synlig) i hele metoden (eksempel 3)."

"Hvis en variabel er en instansvariabel (eksempel 4), er den knyttet til et bestemt objekt og eksisterer så længe objektet eksisterer. Hvis der ikke findes noget objekt, så er der ingen instanser af variablen. Du kan få adgang til variablen (dvs. variablen er synlig) fra alle metoder i klassen, uanset om de blev erklæret før eller efter den. Der oprettes en ny variabel for hvert objekt. Den er uafhængig af andre objekter. Du kan ikke få adgang til en instansvariabel fra statiske metoder . "

"Hvis en variabel er erklæret statisk, dvs. markeret med nøgleordet static , eksisterer den så længe dens klasse eksisterer. JVM'en indlæser normalt en klasse i hukommelsen ved dens første brug. Det er også når statiske variable initialiseres."

Mere om variabelt omfang - 1

"Eksemplet ovenfor erklærer Cat-klassen, som har fire variabler: a, b, s (ikke-statiske variable) og count (en statisk variabel). Hvis vi opretter flere objekter af denne klasse (f.eks. tre), hver af dem vil indeholde sine egne forekomster af klassens ikke-statiske variable. En statisk variabel deles af alle objekter i en klasse. Teknisk set er den ikke engang inde i disse objekter, da den eksisterede, før nogen Cat-objekter blev oprettet."

"Her er, hvad der sker, hvis vi erklærer variabel sstatisk:"

Mere om variabelt omfang - 2

"OK. Jeg tror, ​​jeg forstår det."

"Kan du erklære variabler med samme navn?"

"Ikke inde i en metode. Alle variable erklæret inde i en metode skal have unikke navne. En metodes argumenter betragtes også som lokale variabler."

"Hvad med medlemsvariabler?"

"Medlemsvariabler skal også være unikke for hver klasse."

"Men der er en undtagelse: navnene på lokale variabler og medlemsvariabler kan være identiske. "

"Hvis vi ændrer sådan en variabel, hvilken af ​​de to identisk navngivne variable vil så blive ændret?"

"Hvis der er flere synlige (tilgængelige) variabler i vores kode - for eksempel en instansvariabel og en lokal variabel - vil den lokale variabel blive tilgået."

Eksempel med to tællevariable
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
    }
}

"Denne kode erklærer to tællevariabler. Linje 3 erklærer en instansvariabel , og linje 8 - en lokal variabel ."

"Her er, hvad der sker, når kørselsmetoden udføres:"

"I linje 7 får vi adgang til instansvariablen og tildeler den værdien 15"

"I linje 8 erklærer (opretter) vi en ny lokal variabel : count. Den maskerer instansvariablen. Den lokale variabel er, hvad al efterfølgende kode i metoden vil se (adgang)."

"Forstået."

"Den lokale variabel maskerer instansvariablen. Med andre ord er den lokale variabel den, der skal tilgås. Du kan dog også få adgang til instansvariablen. Det er bare lidt mere kompliceret at gøre det."

Statisk (klasse) variabel
ClassName.variableName

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

// Here are some examples:
this.catsCount

"Hvad kan du ellers fortælle mig om statiske metoder og statiske variable?"

"Statiske metoder og variabler er ikke knyttet til objekter i klassen; de er knyttet til selve klassen. Hvis vi opretter ti Variables- objekter (se eksemplet i begyndelsen af ​​dette niveau), vil vi have ti instanceVariable -variabler (en for hver objekt) og kun én delt (statisk) variabel TEXT ."

"Jeg har et spørgsmål."

"Hvad er forskellen mellem statiske og ikke-statiske metoder?"

"Lad os tage et kig på, hvordan en ikke-statisk metode virker:"

Hvordan ser koden ud
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Hvad sker der virkelig
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"Når du kalder en metode ved hjælp af <objekt> prik <metodenavn> , kalder du faktisk en klassemetode og sender det samme objekt som det første argument. Inde i metoden kaldes objektet 'dette' . Alle operationer i metode udføres på dette objekt og dets data."

"Wow! Så det er sådan det hele fungerer!"

"Og sådan fungerer en statisk metode."

Hvordan ser koden ud
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Hvad sker der virkelig
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"Når du kalder en statisk metode, sendes intet objekt til den. Med andre ord er 'dette' lig med null . Det er derfor, en statisk metode ikke kan få adgang til ikke-statiske variabler og metoder (da den ikke har noget 'dette' at videregive til disse metoder)."

"Hmmm. Jeg tror, ​​jeg forstår det. I hvert fald en lille smule."

"Og her kommer onkel Diego... og hans opgaver."