Да ладно, в этой статье досконально разбирается самое особенное существование в Java — null

Java

Когда мне нечего делать, я не люблю посещать P-станцию, а люблю просматривать технические веб-сайты, такие как programcreek, поэтому в ту ночь, в глухую ночь, я нашел тему, которая фокусируется на основах, но не может быть проигнорировано. Например:Что, черт возьми, null в Java? Подобные душераздирающие темы заслуживают более пристального внимания.

null - это особое существование в Java, потому что это то же самое, что иизвестныйNullPointerException(NPE) идет с вами. Тони Хоар, изобретатель NPE, признал в 2009 году: «Нулевые ссылки — нелепый дизайн, как будто я проиграл пари на миллиард долларов».

Так почему же Java сохраняет значение null, а не уничтожает его? Я думаю, это потому, что существование null действительно приносит Java больше преимуществ (я укажу на некоторые ниже, посмотрите, сможете ли вы это заметить).

Начнем со следующего утверждения.

String s = null;

Во-первых, давайте рассмотрим: что такое переменная и что такое значение. Чтобы привести правильный пример, переменная подобна пещере, в которой могут жить люди или нет, а люди эквивалентны значениям. В Java, если переменная хочет сохранить значение, ей нужно объявить, к какому типу она относится.

s — это переменная типа String, в этом нет сомнений, верно? Это уж точно, второй брат, перестань нести чепуху, как можно сомневаться в этом.

Java имеет два типа: примитивный тип и ссылочный тип. Переменная, объявленная как примитивный тип, хранит значение, а переменная, объявленная как ссылочный тип, хранит ссылку на объект, в этом никто не сомневается.

Что касается предыдущего утверждения, String — это ссылочный тип со значением null, что означает, что переменная s ничего не хранит, как никто не живет в пещере.

еслиString s = "沉默王二", можно представить следующим рисунком.

а такжеString s = nullРепрезентация иная, у нее нет объекта для ссылки.

ЭтоЧто, черт возьми, ноль в памяти?? Что такое значение null в Java?

В любом случае, null не является допустимым объектом, поэтому для него не выделено место в памяти, нет места для него. null — это просто репрезентативное обозначение того, что ссылка не указывает ни на какой объект в данный момент. Также нет определенного значения для null, указанного в спецификации виртуальной машины Java.

Это не только напоминает мне классическую строчку из буддийских писаний, но, должно быть, все уже догадались об этом, так что читайте вслух! "Форма — это пустота, пустота — это форма. "Слово "пустой" в нашем китайском подходит к этомуnull, другими словами "null это пусто, а empty это null." Классика, классика.

классЕсли переменная-член является ссылочным типом, ее значение по умолчанию равно null., который отличается от базового типа.

public class Null {
    private String name;
    private int age;

    public static void main(String[] args) {
        Null n = new Null();

        System.out.println(n.name);
        System.out.println(n.age);
    }
}

Вывод приведенного выше кода:

null
0

Но если это локальная переменная ссылочного типа, компилятор напомнит нам об ее инициализации.

Если переменная в настоящее время не имеет определенного значения для инициализации, то наилучшим выбором является нуль, так называемая ленивая инициализация, до тех пор, пока она не будет фактически использована, а затем не будет присвоена «фактическое» значение (1-е преимущество нуля). Еще удивительнее то, чтоnull может быть принудительно.

String s = (String) null;
Integer i = (Integer) null;

System.out.println(s);
System.out.println(i);

Программа не только скомпилировалась, но и не вызвала ужасный NPE во время выполнения. Однако в Java по-прежнему действуют принципы: когда переменной базового типа присваивается значение null, она не будет компилироваться.

Является ли компилятор очень интеллектуальным и удобным для пользователя?В конце концов, базовые типы и ссылочные типы разные, и null может использоваться только как значение инициализации ссылочных типов, но не как значение инициализации базовых типов, потому что базовые типы имеют свои собственные значения инициализации, такие как Say 0 для int. Не будьте слишком доверчивы с искусственным интеллектом, я обещаю запутать компилятор.

Integer j = null;
int k = j;
System.out.println(k);

Сначала присвойте null переменной типа-оболочки базового типа, а затем присвойте переменную переменной базового типа, и компилятор бессилен. Тем не менее, NPE будет подхватываться и взбиваться во время выполнения.

Есть еще один интересный факт о null:instanceof вернет false, если используется ссылочная переменная с нулевым значением..

String s1 = null;
System.out.println(s1 instanceof String); // false

То есть, если значение переменной ссылочного типа не равно null, и для определения типа используется оператор instanceof, он не генерируетClassCastException, то результат верный. В противном случае, даже если тип явно объявлен для переменной, скажемString s1 = null, instanceof по-прежнему не может узнать, что s1 имеет тип String.

Что ж, давайте посмотрим на другие варианты использования null, такие как указание на то, что объект не существует, условия завершения.

На картинке нижеSystem.console()Javadoc для метода, возвращающего уникальный объект, связанный с текущей виртуальной машиной Java, если он есть, или null, если его нет.

Подумайте об этом, если бы Java не сохранял null, что бы он вернул? Необходимо определить по крайней мере еще одно ключевое слово с тем же значением, что и null.

Рассмотрим другой пример, изjava.io.BufferedReaderКатегорияreadLine()метод

public String readLine() throws IOException

Returns: A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached.

Этот метод возвращает прочитанную строку построчно до конца потока. Как судить об окончании потока, вернуть ноль. В этом случае мы можем использовать null как условие для чтения строк.

String line;
while ((line = reader.readLine()) != null) {
   System.out.println(line);
}

Конечно, вы также можете вернуть другие ключевые слова, такие как -1, чтобы указатьreadLine()до конца потока, но это мало чем отличается от возврата null.

Напоследок предлагаю известную цитату Рассела: "Существование разумно. «Поскольку нуль уже существует, для его существования есть причина, независимо от его достоинств или недостатков.


Ну что же, читатели и друзья, вышеизложенное и есть все содержание этой статьи. Здесь вы видите всех лучших программистов, именно вы получаете повышение и прибавку 👍.Оригинальность непростая, если вы считаете ее полезной, пожалуйста, не скупитесь на право лайка в ваших руках.

PS: Конечно, есть более красивые оригинальные статьи по Java, и перечислять их все здесь неудобно, если вам интересно, вы можете зайти в публичный аккаунт [Silent King II] и ответить [null], чтобы получить их .