Разница между переменными конструктора и экземпляра

Мне нужно понять переменные конструктора и экземпляра. Мой вопрос в том, что конструктор инициализируется в строке 1, а я могу сделать это, создав переменную экземпляра в строке 2. Почему мне нужно инициализировать значение, используя конструктор, вместо этого я могу инициализировать значение, используя переменную экземпляра?

class ExampleConstructor{
    int value;
    ExampleConstructor(int value){
        this.value=value;
    }
}
public class Main{
    public static void main(String[] args){
        ExampleConstructor constructor=new ExampleConstructor(100);/*line 1*/
        System.out.println(constructor.value);
        constructor.value=10;/*line 2*/
        System.out.println(constructor.value);
    }
}

Вы спрашиваете, почему нельзя просто сделать int value = 10;? Потому что ты можешь. Конструктор просто позволяет вам инициализировать значение при создании объекта.

GBlodgett 18.12.2018 15:48

Вы абсолютно можете это сделать. Просто используйте пустой конструктор. Вам нужно использовать конструктор для создания экземпляра, потому что ваш класс не является статическим классом, и вы вызываете его из статического метода (main).

Sai Puli 18.12.2018 15:51

Вы можете видеть это как рождение чего-либо или создание этого. для создания чего-либо, очевидно, вам нужны ингредиенты, иначе в вашем творении не будет ничего важного. И вы не можете редактировать атрибуты создания, прежде чем его породить (магический оператор new). Это все.

Incepter 18.12.2018 15:52

Вы должны прочитать об инкапсуляции: stackoverflow.com/questions/1568091/…

Djory Krache 18.12.2018 15:55

Я думаю, вам следует убрать слово «Contstructor» из названия вашего класса. Если вы зададите вопросы о конструкторе Constructor, это вызовет путаницу и непонимание.

Solomon Slow 18.12.2018 16:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 707
3

Ответы 3

Иногда это лучше. Ваша строка 2 больше похожа на сеттер, например, constructor.setValue (2);

Теперь смотри:

MyConstructor myConstructor  = new MyConstructor(2,3,5,"This is my cons");
//or
myConstructor.int1 = 2;
myConstructor.int2 = 3;
myConstructor.int3 = 5;
myConstructor.string1 = "This is my cons";

У вас четыре строки в одной строке.

Также у нас не было доступа к таким полям, мы должны использовать геттеры и сеттеры.

Когда вы вызываете конструктор таким образом, вы просто присваиваете значение полю при создании объекта. Когда вы используете сеттеры, вы можете получить доступ к полям в любое время.

Прошу прощения за мой английский. Надеюсь, ты понимаешь.

Иногда нужно убедиться, что переменные находятся в каком-то диапазоне. Например, когда у вас есть RandomObject с полем probability, вам нужно убедиться, что вероятность находится между 0 и 1. Вторая причина, иногда мы хотим убедиться, что это поле нельзя изменить (для предотвращения ошибок) извне класса. Следовательно, мы не можем присвоить значение извне класса, поэтому нам нужно сделать это с помощью конструктора (или методов). В-третьих, иногда мы используем один и тот же аргумент для вычисления нескольких полей (например, area и side). Есть много других причин, таких как предотвращение дублирования кода, упрощение чтения кода или упомянутая ранее инкапсуляция.

Конструктор используется для создания экземпляра вашего класса.

Если вас не заботит, чтобы значение редактировалось несколькими местами кода и влияло на всех, то вы можете сделать valuestatic и использовать его без конструктора. Очень важно понимать различия между переменными экземпляра и статическими переменными, потому что есть места, где статика имеет смысл.

В вашем случае вы создаете экземпляр класса ExampleConstructor, вызывая его конструктор и назначая его переменной constructor. Затем измените «переменную экземпляра» value на 10. Вам не нужно передавать значения в конструктор, вы можете иметь пустой конструктор и устанавливать значение после создания экземпляра объекта.

Если вы сделаете элемент valuestatic, например static int value;, и используете его без конструктора, например ExampleConstructor.value, это сработает. Но проблема в том, что если другой фрагмент кода устанавливает для ExampleConstructor.value значение 2828, то каждый фрагмент кода после этой строки получит 2828 при печати ExampleConstructor.value.

Если вы не хотите, чтобы это произошло, если изменение в одном месте кода влияет на все остальные. Затем вы должны определить член value как переменную экземпляра и использовать конструктор для создания экземпляра объекта и использования переменной экземпляра.

ИМО, ваше наименование класса и переменных может сбить читателя с толку.

Посмотрите блок кода ниже для лучшего объяснения.

public class HelloWorld{

     public static void main(String []args){
        System.out.println("Printing static value from TestClass.");
        // Observe that the TestClass is not being instantiated to operate on staticValue;
        System.out.println("TestClass.staticValue:  " + TestClass.staticValue);
        changeStaticValue();
        System.out.println("\nPrinting static value from TestClass after editing.");
        System.out.println("TestClass.staticValue:  " + TestClass.staticValue);

        TestClass instance1 = new TestClass();
        TestClass instance2 = new TestClass(123);
        System.out.println("\nPrinting instance value of both instances right after instantiation.");
        System.out.println("instance1.instanceValue:  " + instance1.instanceValue);
        System.out.println("instance2.instanceValue:  " + instance2.instanceValue);
        instance1.instanceValue = 888;
        instance2.instanceValue = 999;
        System.out.println("\nPrinting instance values after editing.");
        System.out.println("instance1.instanceValue:  " + instance1.instanceValue);
        System.out.println("instance2.instanceValue:  " + instance2.instanceValue);

     }

     private static void changeStaticValue()
     {
         TestClass.staticValue = 11111;
     }
}


class TestClass
{
    public static int staticValue;
    public int instanceValue;

    public TestClass()
    {

    }
    public TestClass(int instVal)
    {
        this.instanceValue = instVal;
    }
}

Другие вопросы по теме