В объектно -ориентированном программировании на основе классов переменная экземпляра — это переменная, определенная в классе (т. е. переменная-член ), для которой каждый экземпляр объекта класса имеет отдельную копию или экземпляр . [1] [2] Переменная экземпляра имеет сходство с переменной класса , [3] но не является статической . Переменная экземпляра — это переменная, которая объявлена в классе, но вне конструкторов , методов или блоков . Переменные экземпляра создаются при создании экземпляра объекта и доступны всем конструкторам, методам или блокам в классе. Переменной экземпляра могут быть заданы модификаторы доступа .
Переменная экземпляра не является переменной класса , [4] хотя есть сходства. Оба являются типом атрибута класса (или свойства класса, поля или члена данных). В то время как значение переменной экземпляра может различаться между экземплярами класса, переменная класса может иметь только одно значение в любой момент времени, общее для всех экземпляров. Та же дихотомия между членами экземпляра и класса применима и к методам («функциям-членам»).
Каждая переменная экземпляра существует в памяти в течение всего срока жизни объекта, которому она принадлежит. [5]
Переменные экземпляра являются свойствами этого объекта. Все экземпляры класса имеют свои собственные копии переменных экземпляра, даже если значение одинаково от одного объекта к другому. Один экземпляр класса может изменять значения своих переменных экземпляра, не влияя на все другие экземпляры. Класс может иметь как переменные экземпляра, так и переменные класса .
Переменные экземпляра могут использоваться всеми методами экземпляра объекта, но не могут использоваться методами класса. Переменная экземпляра также может быть изменена напрямую, при условии, что установлены ограничения доступа . [6]
запрос структуры { static int count1 ; // имя переменной не имеет значения int number ; Request () { number = count1 ; // изменяет переменную экземпляра "this->number" ++ count1 ; // изменяет переменную класса "Request::count1" } };int Запрос :: count1 = 0 ;
В этом примере C++ переменная экземпляра Request::number
является копией переменной класса Request::count1
, где каждому сконструированному экземпляру присваивается последовательное значение , count1
прежде чем он увеличивается на единицу . Поскольку number
является переменной экземпляра, каждый Request
объект содержит свое собственное уникальное значение; напротив, Request::count1
всем экземплярам класса доступен только один объект с тем же значением.
//Пример.java Пример класса { public int x = 0 ; public void setX ( int newValue ) { this.x = newValue ; } } //Главная.javaclass Main { public static void main ( String [] args ) { Example example1 = new Example (); Example example2 = new Example (); //Мы можем установить значение x само по себе, так как переменная является публичной example1 . x = 10 ; assert example1 . x == 10 ; assert example2 . x == 0 ; //Поскольку setX является методом экземпляра, он также может получить доступ к переменной example2 . setX ( - 10 ); assert example1 . x == 10 ; assert example2 . x == - 10 ; } }
В этом примере Java мы видим, как переменные экземпляра могут быть изменены в одном экземпляре, не влияя на другой.
класс Собака : def __init__ ( self , breed ): self.breed = breed # переменная экземпляра # dog_1 — это объект , # который также является экземпляром класса Dog dog_1 = Dog ( "Border Collie" )
В приведенном выше коде Python переменная экземпляра создается при анализе аргумента в экземпляре с указанием позиционного аргумента породы.