Я работал над проблемой хранения ссылок на два класса друг в друге.
Например:
class A {
B b;
A(B b){
this.b = b;}
}
class B {
A a;
B(A a){
this.a = a;}
}
public static void main(String...s){
A a = new A(new B(null));
a.b.a = a;
}
Теперь, если вместо инициализации выше, если я использую инструкцию ниже:
A a = new A(new B(a));
Я получил ошибку ниже, которая совершенно очевидна:
Main.java:19: error: variable a might not have been initialised
A a = new A(new B(a));
Но если я попробую то же самое в JShell, все будет работать нормально (просто чтобы быть уверенным, что variable a
никогда не инициализировалось, я проверил variable a
непосредственно перед выполнением оператора, который подтверждает, что он не был инициализирован раньше:
Может быть, я что-то здесь упускаю, но может кто-нибудь, пожалуйста, помогите мне понять, почему в JAVA выполняются два разных поведения одного и того же оператора.
Простой способ понять эту проблему заключается в том, что приведенный ниже оператор разрешен в Jshell
, но не в обычной программе:
var somevar = somevar;
Integer x = x
, что вы ожидаете от компилятора? Jshell в значительной степени работает так, как объяснил Андреас. - person Naman   schedule 31.03.2018