static переменная

209
29 января 2020, 17:50
public class Duck {
    int duckCount = 0;
    public Duck(){
        duckCount++;
    }
}

public class Test {
    public static void main(String[] args) {
        Duck duck = new Duck();
        Duck duck1 = new Duck();
        System.out.println(duck.duckCount);
        System.out.println(duck1.duckCount);
    }
}

Здесь в консоли 2 раза выйдет единица (1):
1
1

Не пойму в чем суть если переменную duckCount не помечаем static то значение в консоле выходит 1 у всех, а если static то 2 в данном примере

public class Duck {
    static int duckCount = 0;
    public Duck(){
        duckCount++;
    }
}

public class Test {
    public static void main(String[] args) {
        Duck duck = new Duck();
        Duck duck1 = new Duck();
        System.out.println(duck.duckCount);
        System.out.println(duck1.duckCount);
    }
}

А тут выйдет в консоле:
2
2
Из-за статика не пойму почему


Как я правильно понял если переменная не статичная значит для каждого экземпляра класса будет своя переменная duckCount, а если статичная то общая для всех экземпляров, но в данном примере зачем тогда создавать экземпляры класса если вызываем нашу статичную переменную через Класс.переменная?

Answer 1

Давайте разберем Ваш пример.

public class Duck {
    int duckCount = 0;
    public Duck(){
        duckCount++;
    }
}

Тут у нас есть класс, где есть переменная duckCount = 0, и есть конструктор счетчик Duck

        Duck duck = new Duck();
        Duck duck1 = new Duck();
        System.out.println(duck.duckCount);
        System.out.println(duck1.duckCount);

Тут мы создаем два экземпляра нашего класса, и при этом вызывается конструктор по умолчанию, где мы к новой переменной 0 - применяем счетчик +1
В таком же примере, только со статичной переменной происходит все то же самое, только вот новая переменная не создается, а вызывается та же, к которой все равно применяется конструктор(два раза), ведь мы создали экземпляр класса. Зачем же тогда создавать экземпляр класса? Тут ответить мне сложно, т.к. это порой требует задача, со временем поймете.

И настоятельно рекомендую читать книгу, к примеру Java-8-Полное руководство, автор Шилдт

Answer 2

https://ideone.com/nP27RE

import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
  static class Duck {
    static int duckCount = 0;
    int duckIndex;
    public Duck(){
      duckIndex = ++duckCount;
    }
  }
  public static void main(String[] args) {
    Duck duck = new Duck();
    Duck duck1 = new Duck();
    System.out.println(duck.duckIndex);
    System.out.println(duck1.duckIndex);
  }
}
READ ALSO
Получить информацию о параметрах URL

Получить информацию о параметрах URL

Есть функция URLИз этой функции всегда передается GET параметр key=1234 он добавляется к действующей ссылке

184
Вращение SVG элемента вокруг центра

Вращение SVG элемента вокруг центра

Проблема заключается в том, что если к элементу уже применена трансформация, в моем случае масштаб, при вращении наблюдается эффект растягиванияНо...

208
JavaScript код не работает

JavaScript код не работает

При запуске кода программа не выводит результатВ консоли выдает ошибку "Uncaught SyntaxError: Unexpected number"

217