Каждый метод в вашем исходном коде (в Java, C #, C ++, Pascal, я думаю, что каждый ОО и процедурный язык ...) имеет только одну копию в двоичных файлах и в памяти.
Несколько экземпляров одного объекта имеют отдельные поля, но все имеют один и тот же код метода. Технически существует процедура, которая принимает скрытый параметр this
, чтобы создать иллюзию выполнения метода над объектом. В действительности вы вызываете процедуру и передаете ей структуру (пакет полей) вместе с другими параметрами. Вот простой объект Java и более или менее эквивалентный псевдо-C код:
class Foo {
private int x;
int mulBy(int y) {
return x * y
}
}
Foo foo = new Foo()
foo.mulBy(3)
переводится в этот код псевдо-C (инкапсуляция выполняется компилятором и средой выполнения / виртуальной машиной):
struct Foo {
int x = 0;
}
int Foo_mulBy(Foo *this, int y) {
return this->x * y;
}
Foo* foo = new Foo();
Foo_mulBy(foo, 3)
Вы должны провести различие между кодом и локальными переменными и параметрами, с которыми он работает ( data ). Данные хранятся в стеке вызовов, локально для каждого потока. Код может быть выполнен несколькими потоками, каждый поток имеет свою собственную копию указателя инструкции (место в методе, который он выполняет в настоящее время). Кроме того, поскольку this
является параметром, он является локальным для потока, поэтому каждый поток может одновременно работать с другим объектом, даже если он выполняет один и тот же код.
При этом нельзя изменять метод только одного экземпляра, поскольку код метода является общим для всех экземпляров.