"Professoren kan bare ikke komme seg ut av sporet. Gamle lærere som er vant til å forelese er alltid slik. Det er ingenting han kan fortelle deg som du ikke finner i bøker. Du lærer ikke å svømme ved å lytte til svømmeforelesninger. Forelesninger er bare nyttige når du er kjent med emnet og kan nesten like mye som professoren din."

"Allikevel er leksjonene hans nyttige."

"Jepp. Jeg mener, vi håper de er det. Jo flere perspektiver på emnet du hører, jo nærmere kommer du sannheten. Når du hører bare én, er alt du kan gjøre å tro det eller ikke tro det. OK, la oss komme tilbake til virksomheten."

"La oss se på et bilde jeg har vist deg 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 deklarert i en metode eksisterer (er synlig) fra starten av dens erklæring til slutten av metoden.

2. En variabel deklarert i en kodeblokk eksisterer til slutten av kodeblokken.

3. En metodes parametere eksisterer til metoden kommer tilbake.

4. Variabler i et objekt eksisterer i hele levetiden til objektet som inneholder dem. Synligheten deres er også styrt av spesielle tilgangsmodifikatorer.

5. Statiske (klasse) variabler eksisterer hele tiden programmet kjører. Synligheten deres er også definert av tilgangsmodifikatorer."

"Riktig. Jeg husker dette bildet."

"Flott. La meg minne deg på noen viktige punkter."

"Alle variabler som er deklarert i metoder eksisterer (er synlige) fra punktet der de er deklarert til slutten av metoden (eksempel 1)."

"Hvis en variabel er deklarert i en kodeblokk, eksisterer den til slutten av kodeblokken (eksempel 2)."

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

"Hvis en variabel er en forekomstvariabel (eksempel 4), er den knyttet til et bestemt objekt og eksisterer så lenge objektet eksisterer. Hvis det ikke finnes noe objekt, er det ingen forekomster av variabelen. Du kan få tilgang til variabelen (dvs. variabelen er synlig) fra alle metoder i klassen, uavhengig av om de ble deklarert før eller etter den. En ny variabel opprettes for hvert objekt. Den er uavhengig av andre objekter. Du kan ikke få tilgang til en forekomstvariabel fra statiske metoder . "

"Hvis en variabel er erklært statisk, dvs. merket med nøkkelordet static , eksisterer den så lenge dens klasse eksisterer. JVM laster vanligvis en klasse inn i minnet ved første gangs bruk. Det er også når statiske variabler initialiseres."

Mer om variabelt omfang - 1

"Eksemplet ovenfor erklærer Cat-klassen, som har fire variabler: a, b, s (ikke-statiske variabler) og count (en statisk variabel). Hvis vi lager flere objekter av denne klassen (f.eks. tre), vil hver av de vil inneholde sine egne forekomster av klassens ikke-statiske variabler. En statisk variabel deles av alle objekter i en klasse. Teknisk sett er den ikke engang inne i disse objektene, siden den eksisterte selv før noen Cat-objekter ble opprettet."

"Her er hva som skjer hvis vi erklærer variabel sstatisk:"

Mer om variabelt omfang - 2

"OK. Jeg tror jeg skjønner det."

"Kan du deklarere variabler med samme navn?"

"Ikke inne i en metode. Alle variabler som er deklarert inne i en metode må ha unike navn. En metodes argumenter regnes også som lokale variabler."

"Hva med medlemsvariabler?"

"Medlemsvariabler må også være unike for hver klasse."

"Men det er et unntak: navnene på lokale variabler og medlemsvariabler kan være identiske. "

"Hvis vi endrer en slik variabel, hvilken av de to identisk navngitte variablene vil endres?"

"Hvis det er flere synlige (tilgjengelige) variabler i koden vår - for eksempel en forekomstvariabel og en lokal variabel - vil den lokale variabelen få tilgang."

Eksempel med to tellevariabler
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 koden erklærer to tellevariabler. Linje 3 erklærer en forekomstvariabel , og linje 8 - en lokal variabel ."

"Her er hva som skjer når kjøremetoden kjøres:"

"På linje 7 får vi tilgang til instansvariabelen og tilordner verdien 15 til den"

"I linje 8 erklærer (oppretter) vi en ny lokal variabel : count. Den maskerer forekomstvariabelen. Den lokale variabelen er det all påfølgende kode i metoden vil se (tilgang)."

"Har det."

"Den lokale variabelen maskerer forekomstvariabelen. Med andre ord er den lokale variabelen den som skal åpnes. Du kan imidlertid få tilgang til forekomstvariabelen også. Det er bare litt mer komplisert å gjøre det."

Statisk (klasse) variabel
ClassName.variableName

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

// Here are some examples:
this.catsCount

"Hva annet kan du fortelle meg om statiske metoder og statiske variabler?"

"Statiske metoder og variabler er ikke knyttet til objekter i klassen; de er knyttet til selve klassen. Hvis vi lager ti Variables- objekter (se eksempelet på begynnelsen av dette nivået), vil vi ha ti instanceVariable -variabler (en for hver objekt) og bare én delt (statisk) variabel TEXT ."

"Jeg har et spørsmål."

"Hva er forskjellen mellom statiske og ikke-statiske metoder?"

"La oss ta en titt på hvordan en ikke-statisk metode fungerer:"

Hvordan ser koden ut
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Hva skjer egentlig
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"Når du kaller en metode som bruker <objekt> punkt <metodenavn> , kaller du faktisk en klassemetode og sender det samme objektet som det første argumentet. Inne i metoden kalles objektet 'dette' . Alle operasjoner i metoden utføres på dette objektet og dets data."

"Wow! Så det er hvordan det hele fungerer!"

"Og dette er hvordan en statisk metode fungerer."

Hvordan ser koden ut
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Hva skjer egentlig
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"Når du kaller en statisk metode, sendes ikke noe objekt til den. Med andre ord, "dette" er lik null . Det er derfor en statisk metode ikke kan få tilgang til ikke-statiske variabler og metoder (siden den ikke har noe "dette" å sende til disse metodene)."

"Hmmm. Jeg tror jeg skjønner det. I hvert fall litt."

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