JavaRush /Java блог /Архив info.javarush /Что такое ссылочный тип данных
cerebellum
7 уровень

Что такое ссылочный тип данных

Статья из группы Архив info.javarush
И так, в ходе изучения языка Java никак не могу понять что такое ссылочный тип и для чего его нужно указывать при объявлении экземпляра класса. С классом String, к примеру, всё вроде бы понятно: Что такое ссылочный тип данных - 1

//Создаётся ссылка типа String
String s = "Ссылка на объект, представляющий собой строку";
Но вся ясность исчезает, когда используется подобный подход: Допустим, имеются два класса: A (с методом a1) и B (с методом b1).

class A
{
    public static void a1()
    {
        ///
    }
}

class B
{
    public static void b1()
    {
        ///
    }
}
Так же имеется класс с main методом, в котором к примеру, создаётся объект класса AB.

class GetTypeVar
{
    public static void main(String[] args)
    {
        A obj1 = new A();
        B obj2 = new B();
    }
}
Так, собственно, в чём непонимание:
  • Что означает тип создаваемой переменной в данном случае?
  • Какой тип данных имеется ввиду?
Особенно непонятно, когда создание объекта происходит так:

class GetTypeVar
{
    public static void main(String[] args)
    {
        B obj1 = new A();
        A obj2 = new B();
    }
}
То есть ссылке, ведущей на экземпляр одного класса устанавливается тип класса другого. Зачем? Что это даёт? Вообщем, создание данного топика было навеяно мыслями в поисках истины. Буду рад услышать качественное напутствие...
Комментарии (7)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Назарий Ященко Уровень 1
30 июля 2019
String - это класс которые представляет символьные строки. docs.oracle.com Увидеть это можно нажав Cntrl + Левую кнопку мышки (IntelliJ IDEA) на "String" в коде.
tanzwud Уровень 34
13 марта 2015
Есть намного проще объяснение что такое ссылочный тип.
Для этого правда нужно немного разбираться в работе памяти JVM и знать что такое stack & heap. Допустим new создает новый обьект. Этот обьект будет помещен в heap. Как только мы хотим провести операцию над этим обьектом в stacke создается ссылка на этот обьект. Отсюда и получается ссылочный тип.
Что касается насчет конкретного типа. Так тип это можно сказать набор все implement интерфейсов и extend классов.
Пример
<code>class A extends B implement C,D</code>
Concrete типы класса А будут A, B, C, D
cerebellum Уровень 7
12 марта 2015
Запись
A obj2 = new B();

означает, что переменная obj2 будет содержать список методов которые есть в классе А, а саму реализацию этих методов будет брать из класса В и при этом личные методы класса В, в данной переменной, видны не будут.

Спасибо, понятно. Буду дома, поиграюсь в ИСР, опять же в поисках доказательной базы.

Я, так понимаю, подобный подход тесно связан с интерфейсами, и только с ними?

В какой ситуации может найти (лучше всего использовать) применение сие кодолепство?
dimaMJ Уровень 25
12 марта 2015
То есть кратко говоря, тип ссылочной переменной определяет набор методов которые вообще можно вызвать, а создаваемый обьект реализацию этих методов.
dimaMJ Уровень 25
12 марта 2015
B obj1 = new A();
A obj2 = new B();

такого из вашего примера и близко быть не может, допустим так
A obj2 = new B();

можно делать, если класс B является потомком класса А, то есть наследует его.
Следовательно, если В наследует А, то такой
B obj1 = new A();

записи быть не может.
Запись
A obj2 = new B();
означает, что переменная obj2 будет содержать список методов которые есть в классе А, а саму реализацию этих методов будет брать из класса В и при этом личные методы класса В, в данной переменной, видны не будут.