Это действительно хороший вопрос.
Позвольте мне попытаться уточнить ваш код, который вы написали выше.
test (null);
При этом null
будет преобразован в строковый тип, вызывая test(String obj)
, в соответствии с JLS, в котором вы уверены при вызове.
test ((10% 2 == 0)? null: new Object ());
, который будет возвращать логическое значение "истинное значениеИтак, первое логическое «истинное» значение будет автоматически приведено к объекту класса Boolean Wrapper.Boolean wrapper Object находит наилучшее совпадение с вашим параметром new Object()
в троичном операторе.И метод вызывает Object в качестве параметра, поэтому он вызывает следующий метод
public static void test (Object obj)
Для эксперимента вы можете попробовать следующеекомбинации, тогда вы получите лучшую ясность.
test ((10% 2 == 0)? New Object (): "stringObj");
test ((10% 2 == 0)? New Object (): null);
test ((10% 2 == 0)? "stringObj": null);
- Наконец в последнем, когда вы звоните сследующий код.
test ((10% 2 == 0)? null: null);
На этот раз снова возвращается как логическое значение "true"значение, и оно снова будет следовать тем же приведениям, как описано выше.Но на этот раз в вашем троичном операторе нет параметра new Object()
.Так что это будет автоматическое приведение типа в null
ObjectСнова следует тот же вызов метода, что и для вашего первого вызова метода
- В последний раз, когда вы спрашивали код, если вы указали
if .. else
оператор.Тогда и компилятор делал честное решение с кодом.
if (10% 2 == 0) {test (null);}
Здесь все время выполняется условие if и вызывается этот код test(null)
.Поэтому все время он вызывает первый test(String obj)
метод с String в качестве параметра, как описано выше.