И так, в ходе изучения языка Java никак не могу понять что такое ссылочный тип и для чего его нужно указывать при объявлении экземпляра класса. С классом
String
, к примеру, всё вроде бы понятно:
//Создаётся ссылка типа 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();
}
}
То есть ссылке, ведущей на экземпляр одного класса устанавливается тип класса другого. Зачем? Что это даёт?
Вообщем, создание данного топика было навеяно мыслями в поисках истины.
Буду рад услышать качественное напутствие...
Для этого правда нужно немного разбираться в работе памяти JVM и знать что такое stack & heap. Допустим new создает новый обьект. Этот обьект будет помещен в heap. Как только мы хотим провести операцию над этим обьектом в stacke создается ссылка на этот обьект. Отсюда и получается ссылочный тип.
Что касается насчет конкретного типа. Так тип это можно сказать набор все implement интерфейсов и extend классов.
Пример
Concrete типы класса А будут A, B, C, D
B, C, D -> reference type
A -> object type
Спасибо, понятно. Буду дома, поиграюсь в ИСР, опять же в поисках доказательной базы.
Я, так понимаю, подобный подход тесно связан с интерфейсами, и только с ними?
В какой ситуации может найти (лучше всего использовать) применение сие кодолепство?
но лично для меня интерфейс это способ взаимодействия с классом, то есть такой записью, мы определяем только те методы которые нам нужны чтобы были видны, даже если в классе Cat личные методы обьявлены private, такой способ еще больше придаст инкапсуляции.
Но конечно не обязательно только с интерфейсами такое проделывать, это можно делать с любым классом, который является родителям для других классов, помимо всего это открывает возможности полиморфизма.
такого из вашего примера и близко быть не может, допустим так
можно делать, если класс B является потомком класса А, то есть наследует его.
Следовательно, если В наследует А, то такой
записи быть не может.
Запись означает, что переменная obj2 будет содержать список методов которые есть в классе А, а саму реализацию этих методов будет брать из класса В и при этом личные методы класса В, в данной переменной, видны не будут.