Объем выделенной памяти для создания объекта на основе размера класса - PullRequest
0 голосов
/ 24 апреля 2020

Как компьютер узнает, сколько памяти выделено для объекта (на основе разных размеров классов)? Ниже приведен пример.

public class Point(){
   public int x;
   public int y;
   public Point(int x, int y){
      this.x = x;
      this.y = y;
   }
}

Point x = new Point();

Когда ключевое слово «new» сначала выделяет память для нового объекта, а затем вызывает конструктор класса, как компьютер узнает перед вызовом конструктора, какой объем памяти выделить? для вновь созданного объекта?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Пытался написать комментарий, но он слишком длинный.

Эта строка:

Point x = new Point();

может быть разбита на три части:

  1. объявление переменной : Point x
  2. назначение: =
  3. создание объекта: new Point()

Часть 3 (создание объекта) приводит к выделению памяти и инициализации экземпляра. Только часть 3 определяет, какой объект вы хотите выделить (new Point(), new Circle(), et c). Так как среда выполнения знает о типе, она может вычислить объем требуемой памяти.

Часть 1 (объявление переменной) просто сообщает остальной части кода, как он может получить доступ к вновь выделенному объекту, поэтому, типы слева и из право присвоения оператора = может отличаться.

Если и Point, и Circle наследуют один и тот же базовый класс Drawing, то в C# вы можете написать:

Drawing x = new Point();

Этот образец все еще выделяет точку из-за new Point(), но остальная часть кода может использовать точку только как экземпляр базового класса, Drawing, например:

x.Draw();

и не может использовать его как Point без отливки:

x.x = 100; // compile time error
0 голосов
/ 24 апреля 2020

JVM знает, потому что она прочитала файл .class, описывающий класс.

Если вы запустите команду javap -v Point.class, вы сможете убедиться в этом:

...
class Point
  minor version: 0
  major version: 58
  flags: (0x0020) ACC_SUPER
  this_class: #1                          // Point
  super_class: #3                         // java/lang/Object
  interfaces: 0, fields: 2, methods: 1, attributes: 1
...
{
  public int x;
    descriptor: I
    flags: (0x0001) ACC_PUBLIC

  public int y;
    descriptor: I
    flags: (0x0001) ACC_PUBLIC
...

Так как он знает, что есть два поля, оба типа int (descriptor: I), он точно знает, сколько памяти потребуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...