JAVA_ONLY Ответов: 2

Sample sample = new sample1 (); что происходит в этом операторе в java, пожалуйста, скажите на уровне памяти.


Ява Сомнения:

что происходит, когда мы используем
Sample sample // this variable for Sample class

но ссылаясь на Sample1(другой класс).

Кто-нибудь, пожалуйста, объясните в потоке..

Что я уже пробовал:

Sample sample = new Sample1();


что происходит в этом заявлении на java, пожалуйста, расскажите на уровне памяти.

Richard MacCutchan

Будет создан новый объект Sample1 и выполнен его конструктор. То, что происходит на уровне памяти, будет зависеть от того, как был определен класс.

2 Ответов

Рейтинг:
13

CPallini

Отказ от ответственности: не видя объявлений классов, следующее - просто дикое предположение.


Это называется полиморфизм, см., например: Полиморфизм в Java-javatpoint[^].


Sergey Alexandrovich Kryukov

5ед, но не уверен, что вопрошающий получит все это.
Я хочу сказать: здесь нет никакой дикой догадки. Есть только две возможности: показанная строка будет компилироваться или нет. Он компилируется, существует совместимость присваивания между классами, в противном случае они не совместимы с присвоением. Ну да, в зависимости от членов класса, это может иметь или не иметь практического смысла. :-)

Возможно, это может сбить с толку, Как одиночный объект может быть связан с Полиморфизм. Всего в одной строке кода полиморфизм уже присутствует, но в потенциале.

—СА

CPallini

Спасибо.

Maciej Los

БОЛЬШАЯ ПЯТЕРКА!

CPallini

БОЛЬШОЕ ВАМ СПАСИБО! :-)

Рейтинг:
1

Triest

Java-программы не имеют прямого доступа к памяти, поэтому вы не должны беспокоиться о вопросах памяти. Реализация памяти может быть специфичной для реализации виртуальной машины Java. Однако я могу обрисовать вам общий процесс.

Для того чтобы этот код работал, класс Sample1 должен быть потомком класса Sample. Каждый класс представлен в памяти данными (переменными-членами класса) и таблицей vtable. Vtable-это массив указателей на виртуальные методы, принадлежащие этому классу. Например, если класс Sample определен следующим образом:

public class Sample {
  int var1;
  int var2;
  Sample() {}
  public void method1() {}
  public void method2() {}
}

он может быть представлен в памяти следующим образом:

vtable pointer<br />
var1<br />
var2


где указатель vtable указывает на этот массив указателей на методы:

<br />
0: method1 from Sample class<br />
1: method2 from Sample class


Если у вас есть класс-потомок Sample1, подобный этому:
public class Sample1 extends Sample {
  int var3;
  Sample1() {}
  @Override
  public void method1() {}
  @Override
  public void method2() {}
}

он будет представлен в памяти следующим образом:

vtable pointer<br />
var1<br />
var2<br />
var3


где указатель vtable указывает на этот массив указателей на методы:]

0: method1 from Sample1 class<br />
1: method2 from Sample1 class


Когда вы создадите экземпляр класса Sample1 с помощью new, он создаст вышеуказанную структуру памяти для класса Sample1. Когда вы назначаете его переменной типа Sample:
Sample sample = new Sample1();

компилятор позволит это сделать, потому что класс Sample1 может быть использован в качестве класса Sample без проблем. Действительно, экземпляр класса Sample1 имеет те же переменные (var1, var2), что и класс Sample, и находится в тех же позициях. Что касается класса Sample1 vtable, то он имеет методы с той же сигнатурой и в тех же позициях, что и класс Sample. Таким образом, вы можете безопасно работать с классом Sample1 через переменную Sample, поскольку она совместима с ним. Надеюсь, это объяснение вам поможет.


Sergey Alexandrovich Kryukov

5ед. Я бы добавил, что это тот случай, когда sample имеет тип sample во время компиляции, который отличается от типа Sample1 во время выполнения. Действительно, это основа полиморфизма.
—СА