Разница между конструктором и экземпляром переменных - PullRequest
0 голосов
/ 18 декабря 2018

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

0 голосов
/ 18 декабря 2018

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

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

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

Если вы сделаетечлен value a 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;
    }
}
0 голосов
/ 18 декабря 2018

Иногда лучше. Ваша строка 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";

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

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

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

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

0 голосов
/ 18 декабря 2018

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

0 голосов
/ 18 декабря 2018

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

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

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

...