Является ли нулевая ссылка экземпляром класса? - PullRequest
5 голосов
/ 20 января 2012

Это простой код

class Foo {
}

class Bar extends Foo {
}

public class Main {

public static void main(String[] args) throws Exception {
    fn(null);
}

static void fn(Foo f) {
    System.out.println(f instanceof Foo ? "Foo" : "Bar");
}
}

Мой вопрос: откуда Java знает, что переданный ноль равен Bar, а не Foo?Я знаю, почему компилятор выбирает Bar, а не Foo (потому что происходит преобразование из foo в bar и из bar в foo, а не наоборот).Но как метод узнает, что этот ноль исходит от Бара, а не от Фу?содержит ли null некоторую информацию об объекте, который назначен?

Ответы [ 5 ]

23 голосов
/ 20 января 2012

Вы читаете это неправильно. instanceof всегда оценивается как false для null ссылок.

Из спецификации Java (выделено мной):

Во время выполнения результат оператора instanceof равен true , если значение RelationalExpression не равно нулю и ссылка может быть приведена (§15.16) к ReferenceType без вызова ClassCastException. В противном случае результат будет ложным.

1 голос
/ 14 ноября 2014

Является ли нулевая ссылка экземпляром класса?

Давайте проясним это. Ссылка не является примером чего-либо. Это ссылка. Объект , на который он ссылается , если есть, является экземпляром некоторого класса. Но нулевая ссылка не относится ни к какому объекту.

Мой вопрос: откуда Java знает, что переданный ноль - это Bar, а не Foo?

Это не так. Ваша программа лгала вам. Он печатает «Bar», если ссылка не ссылается на экземпляр Foo. Плохое кодирование с вашей стороны.

Я знаю, почему компилятор выбирает Bar, а не Foo (потому что происходит преобразование из foo в bar и из bar в foo, а не наоборот).

Компилятор не сделал такого выбора. Ваш код прошел плохо спроектированный тест и распечатал.

Но как метод узнает, что этот ноль исходит от Бара, а не от Фу?

Это не так. Догадалась. Это неправильно.

содержит ли null некоторую информацию об объекте, который назначен?

Он вообще не содержит информации.

1 голос
/ 20 января 2012

Что вы подразумеваете под

Как Java знает, что это нуль - это Bar, а не Foo?

null - это не Bar и Foo,См. Отправка метода Java с нулевым аргументом

1 голос
/ 20 января 2012

Это всегда ложь.Джавак знает это.

Но вы можете использовать f.someStaticFunctionOfTheClassFoo ().Итак, ваш вопрос очень интересный, только его нужно отредактировать.

0 голосов
/ 08 августа 2016

null - это специальный тип, а этот специальный тип - "NullType".

...