Мне нужно понять переменные конструктора и экземпляра. Мой вопрос в том, что конструктор инициализируется в строке 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);
}
}
Вы абсолютно можете это сделать. Просто используйте пустой конструктор. Вам нужно использовать конструктор для создания экземпляра, потому что ваш класс не является статическим классом, и вы вызываете его из статического метода (main).
Вы можете видеть это как рождение чего-либо или создание этого. для создания чего-либо, очевидно, вам нужны ингредиенты, иначе в вашем творении не будет ничего важного. И вы не можете редактировать атрибуты создания, прежде чем его породить (магический оператор new
). Это все.
Вы должны прочитать об инкапсуляции: stackoverflow.com/questions/1568091/…
Я думаю, вам следует убрать слово «Contstructor» из названия вашего класса. Если вы зададите вопросы о конструкторе Constructor, это вызовет путаницу и непонимание.
Иногда это лучше. Ваша строка 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
как переменную экземпляра и использовать конструктор для создания экземпляра объекта и использования переменной экземпляра.
ИМО, ваше наименование класса и переменных может сбить читателя с толку.
Посмотрите блок кода ниже для лучшего объяснения.
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;
}
}
Вы спрашиваете, почему нельзя просто сделать
int value = 10;
? Потому что ты можешь. Конструктор просто позволяет вам инициализировать значение при создании объекта.