„Нека преминем към нова тема. Сега бих искал да обсъдим статичните променливи и методи.“

„Ели, вече научих за статичните променливи и методи. Но бих искал да науча повече подробности.“

„Когато декларираме променливи в клас, ние определяме дали тези променливи ще бъдат създадени само веднъж or всеки екземпляр (обект) на класа ще има свое копие. По подразбиране се създава ново копие на променлива за всеки обект . Ето How изглежда:"

Декларация на клас
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Код в основния метод:
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
Изход на екрана
Oscar
Missy

„Въпреки че са декларирани в един и същи клас (Cat), променливите cat1.nameи cat2.nameсъдържат различни стойности, защото препращат към различни обекти.“
— Това има смисъл.
„Въпреки това, съществува само едно копие на статична променлива за всеки екземпляр на клас и трябва да бъде достъпен чрез името на класа.“

Декларация на клас
class Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
Код в основния метод:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
Изход на екрана:
0
1
Oscar
Missy
2

„Добре, това също има смисъл.“

"Методите на Java са разделени на две категории. Методите на екземпляра се извикват на обект и имат достъп до данните на този обект. Статичните методи нямат този достъп, тъй като те просто нямат препратка към обект. Те обаче могат да препращат към статичните променливи на класа и други статични методи.

Статичните методи не могат да addressират нестатични методи or нестатични променливи!"

— Защо така, Ели?

"Всяка променлива на екземпляр се съдържа в обект. Тя може да бъде достъпна само ако имате препратка към този обект. Няма такава препратка към статичен метод."

„Методите на екземпляри имат ли такава препратка?“

"Да, предава се индиректно към методите на екземпляр. Препратка към обекта, на който се извиква метод на екземпляр, се предава косвено на метода на екземпляр. Променливата, която съхранява тази референция, се нарича this . Това позволява на метода винаги да има достъп до обекта данни or извикайте друг нестатичен метод на същия обект.

Вместо препратка към обект, null се предава на статични методи. Ето защо те не могат да addressират нестатични променливи и методи. Те просто нямат препратка към обект, свързан с тези променливи и методи."

— Добре, Ели, разбирам това.

„Ето How работят нестатичните методи:

Как изглежда codeът
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Какво наистина се случва
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Когато извиквате метод с помощта на <обект> точка <име на метод>, вие всъщност извиквате метод на клас и предавате същия обект като първи аргумент. Вътре в метода обектът се нарича 'this' . Всички операции в метода се извършват върху този обект и неговите данни."

„Ето How работят статичните методи:

Как изглежда codeът
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Какво наистина се случва
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Когато извикате статичен метод, към него не се предава обект. С други думи, 'this' е равно на null . Ето защо статичен метод не може да има достъп до нестатични променливи и методи (тъй като няма Howво да предаде имплицитно към нестатични методи)."

„Променлива or метод е статичен, ако има ключовата дума static пред себе си.“

„Защо са необходими такива методи, ако са толкова силно ограничени?“

— Е, такива методи имат своите предимства.

„Първо, не е нужно да предаваме препратка към обект, за да използваме статични методи и променливи.

„Второ, понякога е необходимо да има едно и само едно копие на променлива. Например System.out (статичната изходяща променлива на класа System).“

„Трето, понякога трябва да извикате метод, преди да можете да създавате обекти.“

„Ели, можеш ли да ми дадеш пример за това?“

"Защо мислите, че методът main() е статичен? Той е статичен, така че програмистът може да го извика веднага след зареждане на клас в паметта, преди да бъдат създадени обекти."