Что такое нуль в Java? - PullRequest
       53

Что такое нуль в Java?

229 голосов
/ 25 апреля 2010

Что такое null?

Является ли null экземпляром чего-либо?

К какому набору относится null?

Как это отображается в памяти?

Ответы [ 14 ]

1 голос
/ 15 августа 2017

null в Java похож на / похож на nullptr в C ++.

Программа на C ++:

class Point
{
    private:
       int x;
       int y;
    public:
       Point(int ix, int iy)
       {
           x = ix;
           y = iy;
       }
       void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
    Point* p = new Point(3,5);
    if (p != nullptr)
    {
       p->print();
       p = nullptr;
    }
    else
    {
        std::cout << "p is null" << std::endl;
    }
    return 0;
}

Та же программа на Java:

public class Point {
    private int x;
    private int y;
    public Point(int ix, int iy) {
        x = ix;
        y = iy;
    }
    public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
    public static void main(String[] args) {
        Point p = new Point(3,5);
        if (p != null)
        {
            p.print();
            p = null;
        }
        else
        {
            System.out.println("p is null");
        }
    }
}

Теперь вы понимаете из приведенных выше кодов, что является нулевым в Java? Если нет, то я рекомендую вам изучить указатели на C / C ++, и тогда вы поймете.

Обратите внимание, что в C, в отличие от C ++, nullptr не определен, но вместо него используется NULL, что также можно использовать и в C ++, но в C ++ nullptr предпочтительнее, чем просто NULL, потому что NULL в C всегда связан с указатели и все, так что в C ++ к концу слова добавлен суффикс «ptr», а также все буквы теперь строчные, но это менее важно.

В Java каждая переменная класса non-primitive класса всегда является ссылкой на объект этого типа или наследуется, и null является ссылкой на объект класса null, но не указателем null, потому что в Java нет такой вещи как «указатель», но Вместо этого используются ссылки на объекты класса, а в Java нуль связан с ссылками на объекты класса, так что вы также можете называть его как «nullref» или «nullrefobj», но это долго, поэтому просто назовите его «null».

В C ++ вы можете использовать указатели и значение nullptr для необязательные члены / переменные, то есть член / переменная, которая не имеет значения, и если она не имеет значения, то она равна нулюptr, так как null в Java можно использовать, например.

0 голосов
/ 13 июля 2017

Короткий и точный ответ, который формально отвечает на все ваши вопросы из JLS:

3.10.7. Нулевой литерал

Нулевой тип имеет одно значение, нулевую ссылку, представленную null литерал null, который формируется из символов ASCII.

Нулевой литерал всегда имеет нулевой тип.

Выделяется только ссылка типа, который присвоен нулю. Вы не присваиваете значение (объект) для ссылки. Такое распределение зависит от JVM, сколько потребуется ссылки и в какой области памяти она будет выделена.

0 голосов
/ 29 января 2017

В Java есть две основные категории типов: примитив и ссылка . Переменные, объявленные для примитивного типа, хранят значения; переменные, объявленные из ссылочного типа, хранят ссылки.

String x = null;

В этом случае оператор инициализации объявляет переменную «x». «X» хранит ссылку на строку. Здесь null . Прежде всего, null не является допустимым экземпляром объекта, поэтому для него не выделена память. Это просто значение, которое указывает, что ссылка на объект в данный момент не ссылается на объект.

0 голосов
/ 28 ноября 2013

На мой взгляд, интересный способ увидеть нулевое значение в java - это то, что НЕ обозначает отсутствие информации, а просто как буквальное значение, которое может быть присвоено ссылке любого типа. Если вы думаете об этом, если оно обозначает отсутствие информации, то для a1 == a2 быть истинным не имеет смысла (в случае, если им обоим присвоено значение null), поскольку они действительно могут указывать на ЛЮБОЙ объект (мы просто не знаю, на какие объекты они должны указывать) ... кстати, null == null возвращает true в java. Если Java, например будет похоже на SQL: 1999, тогда null == null вернет неизвестное (булево значение в SQL: 1999 может принимать три значения: true, false и unknown, но на практике unknown реализовано как null в реальных системах) ... http://en.wikipedia.org/wiki/SQL

...