Причина на самом деле очень проста: все это связано с scope переменных.
Вот слегка украшенная версия кода, который вы представили:
public static void main(String[] args) {
ObjectA Obj1 = new ObjectA();
ObjectB Obj2 = new ObjectB();
Obj1.changeField(Obj2);
}
В этом коде следует обратить внимание на то, что Obj1
и Obj2
объявлены внутри метода main
. Это означает, что они принадлежат основному методу и не могут использоваться за пределами main
. Это то, что означает «сфера». Если переменная объявлена внутри класса, только этот класс имеет к ней доступ. Если объявлено в методе, только этот метод может использовать его. То же самое относится к структурам цикла и любому другому типу блоков, которые вы можете себе представить. По сути, если переменная была объявлена внутри пары {}
, то она принадлежит этой паре {}
.
Так что теперь, если вы посмотрите на ваш ObjectA
класс, вы заметите, что он сидит сам по себе - он не был объявлен как часть main
метода, так что он может ' t использовать переменную Obj1
- код ObjectA
не знает, что Obj1
даже существует.
Именно поэтому вы должны использовать ключевое слово this
. У вас нет доступа к Obj1
, поэтому вам нужно использовать «переменную», к которой у вас есть доступ - в этом случае у вас есть this
, которая всегда ссылается на текущий экземпляр класса.
Итак, хотя вы все еще используете тот же объект (созданный new ObjectA()
), у вас просто есть разные переменные, которые ссылаются на этот объект, в зависимости от того, какой код вы просматриваете в данный момент. Правила области видимости становятся немного более сложными, но чем больше вы играете с Java, и чем больше вы понимаете классы по сравнению с экземплярами по сравнению со ссылками на экземпляры, тем легче становится их удобно использовать.