Разница между конструктором и экземпляром переменных
Мне нужно понять конструктор и переменные экземпляра. Мой вопрос заключается в том, что конструктор инициализируется в строке 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 ответа
Может быть, проверить этот сайт.
Я нашел это довольно полезным.
Иногда лучше. Ваша строка 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;
}
}