"De professor kan gewoon niet uit zijn sleur komen. Oude leraren die gewend zijn om lezingen te geven, zijn altijd zo. Hij kan je niets vertellen dat je niet in boeken kunt vinden. Zwemmen leer je niet door te luisteren tot zwemcolleges. Colleges zijn alleen zinvol als je bekend bent met het vak en bijna net zoveel weet als je professor."

"Toch zijn zijn lessen nuttig."

"Ja. Ik bedoel, we hopen dat ze dat zijn. Hoe meer perspectieven je over het onderwerp hoort, hoe dichter je bij de waarheid komt. Als je er maar één hoort, kun je het alleen maar geloven of niet geloven. Oké, laten we weer aan het werk."

'Laten we eens kijken naar een foto die ik je eerder heb laten zien.'

┏
┃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. Een in een methode gedeclareerde variabele bestaat (is zichtbaar) vanaf het begin van de declaratie tot het einde van de methode.

2. Een in een codeblok gedeclareerde variabele bestaat tot het einde van het codeblok.

3. De parameters van een methode blijven bestaan ​​totdat de methode terugkeert.

4. Variabelen in een object bestaan ​​gedurende de gehele levensduur van het object dat ze bevat. Hun zichtbaarheid wordt ook bepaald door speciale toegangsmodificaties.

5. Statische (klasse)variabelen bestaan ​​de hele tijd dat het programma draait. Hun zichtbaarheid wordt ook bepaald door toegangsmodifiers."

"Juist. Ik herinner me deze foto."

"Geweldig. Laat me je herinneren aan enkele belangrijke punten."

"Alle variabelen die binnen methoden zijn gedeclareerd, bestaan ​​(zijn zichtbaar) vanaf het punt waar ze zijn gedeclareerd tot het einde van de methode (voorbeeld 1)."

"Als een variabele wordt gedeclareerd in een codeblok, bestaat deze tot het einde van het codeblok (voorbeeld 2)."

"Als een variabele een methodeparameter is, bestaat (is zichtbaar) in de hele body van de methode (Voorbeeld 3)."

"Als een variabele een instantievariabele is (voorbeeld 4), is deze gekoppeld aan een bepaald object en bestaat hij zolang het object bestaat. Als er geen object bestaat, zijn er geen instanties van de variabele. U hebt toegang tot de variabele (dwz de variabele is zichtbaar) van alle methoden van de klasse, ongeacht of ze ervoor of erna gedeclareerd zijn. Voor elk object wordt een nieuwe variabele gemaakt. Deze is onafhankelijk van andere objecten. U hebt geen toegang tot een instantievariabele met statische methoden . "

"Als een variabele statisch wordt verklaard, dwz gemarkeerd met het sleutelwoord static , bestaat deze zolang zijn klasse bestaat. De JVM laadt gewoonlijk een klasse in het geheugen bij het eerste gebruik. Dat is ook wanneer statische variabelen worden geïnitialiseerd."

Meer over variabel bereik - 1

"Het bovenstaande voorbeeld declareert de Cat-klasse, die vier variabelen heeft: a, b, s (niet-statische variabelen) en count (een statische variabele). Als we verschillende objecten van deze klasse maken (bijvoorbeeld drie), elk van ze zullen hun eigen instanties van de niet-statische variabelen van de klasse bevatten. Een statische variabele wordt gedeeld door alle objecten van een klasse. Technisch gezien bevindt hij zich niet eens in deze objecten, aangezien hij al bestond voordat er Cat-objecten werden gemaakt.'

"Dit is wat er gebeurt als we variabele statisch declareren s:"

Meer over variabel bereik - 2

"Oké. Ik denk dat ik het snap."

"Kunt u variabelen met dezelfde naam declareren?"

"Niet binnen een methode. Alle variabelen die binnen een methode worden gedeclareerd, moeten unieke namen hebben. De argumenten van een methode worden ook als lokale variabelen beschouwd."

"Hoe zit het met lidvariabelen?"

"Ledenvariabelen moeten ook uniek zijn voor elke klasse."

"Maar er is een uitzondering: de namen van lokale variabelen en lidvariabelen kunnen identiek zijn. "

"Als we zo'n variabele veranderen, welke van de twee gelijknamige variabelen wordt dan veranderd?"

"Als er verschillende zichtbare (toegankelijke) variabelen in onze code zijn, bijvoorbeeld een instantievariabele en een lokale variabele, wordt de lokale variabele benaderd."

Voorbeeld met twee telvariabelen
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
    }
}

"Deze code declareert twee telvariabelen. Regel 3 declareert een instantievariabele en regel 8 - een lokale variabele ."

"Dit is wat er gebeurt als de methode run wordt uitgevoerd:"

"In regel 7 gaan we naar de instantievariabele en kennen er de waarde 15 aan toe"

"In regel 8 declareren (maken) we een nieuwe lokale variabele : count. Het maskeert de instantievariabele. De lokale variabele is wat alle daaropvolgende code in de methode zal zien (toegang)."

"Begrepen."

"De lokale variabele maskeert de instantievariabele. Met andere woorden, de lokale variabele is degene die toegankelijk is. U kunt echter ook toegang krijgen tot de instantievariabele. Het is alleen iets ingewikkelder om dit te doen."

Statische (klasse) variabele
ClassName.variableName

// Here are some examples:
Cat.catsCount
Niet-statische (instance) variabele
this.variableName

// Here are some examples:
this.catsCount

"Wat kun je me nog meer vertellen over statische methoden en statische variabelen?"

"Statische methoden en variabelen zijn niet gekoppeld aan objecten van de klasse; ze zijn gekoppeld aan de klasse zelf. Als we tien Variables- objecten maken (zie het voorbeeld aan het begin van dit niveau), hebben we tien instanceVariable -variabelen (één voor elk object) en slechts één gedeelde (statische) variabele TEXT ."

"Ik heb een vraag."

"Wat is het verschil tussen statische en niet-statische methoden?"

"Laten we eens kijken hoe een niet-statische methode werkt:"

Hoe de code eruit ziet
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Wat gebeurt er echt
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

"Als je een methode aanroept met <object> dot <method name> , roep je in feite een klassemethode aan en geef je hetzelfde object door als het eerste argument. Binnen de methode heet het object 'this' . Alle bewerkingen in de methode worden uitgevoerd op dit object en zijn gegevens."

"Wow! Dus zo werkt het allemaal!"

"En zo werkt een statische methode."

Hoe de code eruit ziet
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Wat gebeurt er echt
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

"Wanneer u een statische methode aanroept, wordt er geen object aan doorgegeven. Met andere woorden, 'dit' is gelijk aan null . Daarom heeft een statische methode geen toegang tot niet-statische variabelen en methoden (aangezien het geen 'dit' heeft om door te geven voor deze methoden)."

"Hmmm. Ik denk dat ik het snap. In ieder geval een klein beetje."

"En hier komt oom Diego... en zijn taken."