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, 18:46
String - это класс которые представляет символьные строки. docs.oracle.com Увидеть это можно нажав Cntrl + Левую кнопку мышки (IntelliJ IDEA) на "String" в коде.
tanzwud
Уровень 34
13 марта 2015, 00:54
Есть намного проще объяснение что такое ссылочный тип.
Для этого правда нужно немного разбираться в работе памяти JVM и знать что такое stack & heap. Допустим new создает новый обьект. Этот обьект будет помещен в heap. Как только мы хотим провести операцию над этим обьектом в stacke создается ссылка на этот обьект. Отсюда и получается ссылочный тип.
Что касается насчет конкретного типа. Так тип это можно сказать набор все implement интерфейсов и extend классов.
Пример
<code>class A extends B implement C,D</code>
Concrete типы класса А будут A, B, C, D
tanzwud
Уровень 34
13 марта 2015, 01:11
Да думаю стоит добавить.
<code>B b = new A()
C c = new A()
D d = new A()</code>
B, C, D -> reference type
A -> object type
cerebellum
Уровень 7
12 марта 2015, 22:41
Запись
A obj2 = new B();

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

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

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

В какой ситуации может найти (лучше всего использовать) применение сие кодолепство?
dimaMJ
Уровень 25
12 марта 2015, 23:39
да можно написать что то типа
InterfaceAnimal obj = new Cat();

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

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

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

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