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

Мне нужно понять конструктор и переменные экземпляра. Мой вопрос заключается в том, что конструктор инициализируется в строке 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);
    }
}

4 ответа

Может быть, проверить этот сайт.

https://www.tutorialspoint.com/What-is-the-difference-between-class-variables-and-instance-variables-in-Java

Я нашел это довольно полезным.

Иногда лучше. Ваша строка 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). Существует много других причин, таких как предотвращение дублирования кода, упрощение чтения кода или упоминание ранее инкапсуляции.

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

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

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

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

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

IMO, ваши имена классов и переменных могут привести читателя в замешательство.

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

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;
    }
}
Другие вопросы по тегам