Различия между классом и объектом?
К своему стыду, внезапно, осознал, что не понимаю разницы между классом и объектом.
Т.е. чисто теоретически понимаю, что объект это экземпляр класса, т.е. класс это как бы заготовка, а уже объект это уже «вещь», с которой можно непосредственно работать.
Но тогда почему (если рассматривать вопрос в PHP), я все-таки могу работать с методами класса ( ClassName::MethodName() ), так же как и с методами объекта ( $c = new ClassName; $c->MethodName() ), хотя, в первом случае никакого объекта не создано.
Или, в данном случае, класс это просто как бы группа глобальных функций в своём «пространстве имен», которые не требуют «персонализации» путем задания уникальных значений их свойств?
Поиск в гугле почему-то не помог, в основном приводятся аналогии вида «Класс — чертежи машины, объект — сама машина», но ни слова о практическом применении.
Заранее благодарен за разъяснения, а то сия каша в голове уже начинает напрягать =)
- Вопрос задан более трёх лет назад
- 60018 просмотров
Комментировать
Решения вопроса 1
Класс = срособ организации полей, методов и пр. = инкапсулированный «кусок» функциональности, описание структуры будущих объектов + своё пространство имён внутри.
Статическая составляющая класса — static-методы и static-поля — это логический способ организации функциональности, общей для любого объекта выделенной сущности. Тут значение имеет логическая составяющая — например, статический метод Parse есть и в классе int, и в классе Guid — но его функциональность различна и соответствует выделенной сущности. Для static-составляющей класса, в принципе, его можно воспринимать как пространство имён. Но пространсто имён нельзя инициализировать, нельзя создать объект пространства имён.
Объект = экземпляр класса = объект, типом которого является какой-то класс = класс после инициализации = сущность в памяти, обладающая поведением, способная изменять своё состояние.
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Ответы на вопрос 6
Может быть вам легче будет понять, если вы будете думать о классе как о наборе функций, а об объекте как о наборе данных.
Некоторые функции в классе могут быть использованы только с набором данных (т.е. объектом), который передается неявно, когда вы указываете $object->method() .
Другие функции не требуют объекта, поэтому могут быть вызваны напрямую из класса.
С этой точки зрения очень логично выглядит Python, где у любого метода есть явный аргумент self, указывающий на объект, из которого был вызван метод. А запись object.method(5) является краткой записью ObjectClass.method(object, 5) .
Ответ написан более трёх лет назад
Нравится 21 1 комментарий
xinn @xinn Автор вопроса
Отлично! Очень Вам благодарен за ответ, похоже это как раз то, чего мне не хватало.
Я придумал свою дурацкую аналогию.
Класс — это бог, который есть всегда. И бог по образу и подобию своему создаёт экземпляры — человеков. Каждый человек наделён своим набором свойств (рост, вес, . ) и методов (плавать, ходить, летать, . ). А бог в свою очередь наделён общими для всех методами: принимать мольбы, карать, посылать манну небесную и сотворить чудо. Эти методы могут быть приватными. Т.е. бог например может принимать мольбы только людей, а не марсиан. А вот сотворить чудо может как для людей, так и для марсиан — ему не жалко.
Ответ написан более трёх лет назад
Комментировать
Нравится 17 Комментировать

Класс — чертеж, объект класса — машина, собранная по этому чертежу.
Статический метод — это некое устройство (пусть в нашем случае будет GPS-навигатор), которое поставляется вместе с чертежом и представлено в каждой машине, построенной по этому чертежу. Устройство это никак не задействует машину, и работает само по себе.
Вы можете бегать с GPS навигатором не построив машины.
Если отойти от популярного изложения, то статические методы не связываются с экземплярами классов. И могут быть вызваны независимо от того создан экземпляр класса или нет.
Ответ написан более трёх лет назад
Нравится 3 2 комментария
xinn @xinn Автор вопроса
Т.е. я немного прав проводя аналогию с «группой глобальных функций» касаемо статических методов/свойств и классов?

Набор статических методов и свойств может быть рассмотрен как набор глобальных функций и глобальных переменных, которые не требуют создания экземпляра класса, так как в нём не нуждаются.
Chvanikoff @Chvanikoff
Без реализации класса (создания объекта) Вы можете работать только со статическими методами/свойствами класса. Если на примере упомянутой машины — класс описывает, что это такое, а реализация (instance) класса — соответственно, реализовывает какую-то конкретную машину.
Простейший миниатюрный пример:
class Car < public $brand = NULL; >$car = new Car; $car->brand = 'VW'; $car2 = new Car; $car2->brand = 'Жигули';
В итоге у нас 2 машины — VW и Жигули. Обе — экземпляры класса машина (Car). Без создания экземпляра класса Вы не зададите брэнд — нечему его задавать, собственно.
Ну это если примитивы на пальцах.
А вообще — вот, держите: про ООП на php.su
Ответ написан более трёх лет назад
Нравится 2 1 комментарий
xinn @xinn Автор вопроса
Видно я не совсем корректно составил вопрос: то, что Вы написали и есть то, что гуглится с легкостью, и приведенную Вами ссылку я, конечно же, посещал ранее и чего надеялся избежать в ответах.
Спасибо за разъяснение насчет статических методов.
В самом простом случае: Класс — это определение общего поведения для объектов, который этот класс порождает. Объект будет иметь поведение задаваемое этим классом и отличаться от других объектов своим состоянием (ну а если состояние одинаково, то просто это будет как два одинаковых автомобиля — сущностей две разные, но выглядят одинаково ).
Далее, к классу можно добавить статические методы и поля. Здесь уже сам класс будет иметь возжность хранить свое состояние и выполнять действия. В большинстве случаев (но не во всех) это требуется для контроля над производством объектов этого класса (паттерн Синглетон, Фабрика и т.п.).
Еще далее, в объекто-ориентированных языка, все является объектом, поэтому класс тоже может являться объектом. Это нужно для того, чтобы контролировать уже сами классы, подгружать их во время работы программы или ее старта и т.п.
Все это понимание придет с опытом написания программ, просто нужно думать метафорами.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Алексей Сидоров @Gorthauer87
Программист
Всё просто. В случае класса это просто некое описание методов, полей и т.д. Когда мы вызываем любой метод класса, то в аргументах мы неявно передаем указатель this.
То есть в реальности вызов
a->b(arg);
выглядит как
b(arg,a);
А static методы они отличаются от обычных тем, что у них нету этого неявного аргумента this
Ответ написан более трёх лет назад
В php у static методов есть неявные «аргументы» (вообще ключевые слова, равно как и this) self и parent. В python аналогичные аргументы вообще явные, чисто по соглашениям их называют self для методов объектов и class для методов класса, а вообще возможно называть как угодно.
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- PHP
- +2 ещё
Какие простые, «бытовые» задачи подходят для изучения машинного обучения?
- 1 подписчик
- 3 часа назад
- 54 просмотра
Какая разница между объектом и классом
Подобный вопрос может служить проверкой Ваших знаний терминологии объектно-ориентированного программирования (object oriented programming, сокращенно OOP). Такой же вопрос можно было бы задать в контексте интервью программиста C++, или любой позиции вакансии, которая требует понимания концепции объектов в программировании.
Термины class и object определенно связаны друг с другом, но каждый из них имеет свой отдельный смысл. Начнем с объяснения смысла термина «class» в контексте OOP. Определение class относится к реально написанной части кода, которая используется для определения поведения любого такого класса. Итак, class это статическая часть кода, состоящая из атрибутов, которые не меняются во время выполнения программы — наподобие определений методов класса.
Объект это экземпляр класса. Однако термин object относится к реально существующему экземпляру класса. Каждый объект должен принадлежать классу. Объекты создаются и уничтожаются в программе по мере необходимости, поэтому их время жизни ограничено. Пока объекты «живые», их свойства могут значительно меняться.
Конкретный пример поможет разобраться в том, о чем тут идет речь. Предположим, что у нас есть класс Animal (животное). Все животные имеют тела и мозги — и поэтому они могли бы быть атрибутами нашего вымышленного класса Animal. Также мы можем добавить к классу некоторые методы, которые общие у всех животных — такие как movement (перемещение), потому что все животные могут двигаться. Идея, которую Вы хотите осуществить в своем представлении, состоит в том, что этот очень общий шаблон Animal не изменяется, он просто дает несколько строк кода, которые определяют класс Animal.
Экземпляр класса Animal был бы определенным животным — львом, кошкой или зеброй. Эти экземпляры класса называются объектами. Принимая во внимание, что класс Animal — общее понятие, экземпляры этого класса — львы, коты и т. д. — берут за основу общее понятие класса и создают его реальные экземпляры.
Именно по этой причине программисты определяют конструкторы в своих классах — так происходит всегда, когда они хотят создавать объект с определенными свойствами. Например, какого вида животное должно быть, как его зовут, сколько оно весит и т. д. Так что Вы можете думать о конструкторе объекта как о чем-то таком, которое вводит класс в жизнь программы — отсюда и пошло название constructor, потому что функция конструктора создает определенный экземпляр класса.
У объектов есть понятие «время жизни», а у класса нет. И как ясно показывает наш пример класса Animal, каждый объект в программе имеет связанный с ним интервал времени жизни — кот или зебра не могут жить вечно. И свойства этих объектов могут меняться в течении их «жизни»; если мы определим переменную size в классе Animal, то она может обозначать размер животного (например, размер кота как объекта со временем может расти).
Общее отличие объекта от класса. Можно сказать, что в то время как класс является общей концепцией предметного понятия (наподобие Animal), объект это очень определенное воплощение этого класса, причем с ограниченным временем жизни в программе. Другой способ думать об отличии между классом и объектом — класс предоставляет шаблон для чего-то более специального, которое должен определить программист при создании объекта этого класса.
[Ссылки]
1. In Java, what’s the difference between an object and a class? site:programmerinterview.com.
В чем различие между классом, объектом и экземпляром?
Нашел в книге.
Класс — это шаблон или образец по которому будет сделан объект. Обычно класс сравнивают с формой для выпечки печенья, а объект — это само печенье. Конструирование объекта на основе некоторого класса называется получением экземпляра этого класса.
/*Java. Библиотека профессионала, том 1. Основы
*9-е издание
*/Кей С. Хорстманн, Гари Корнелл
Решения вопроса 2

Есть стул — это класс. Он имеет какие то параметры типа количества ножек и площади посадочной поверхности. Просто эти параметры есть, и все, без значений. Можно еще назвать их свойствами. Конкретный стул на котором вы сидите — это экземпляр класса. Он уже имеет конкретные значения свойств, что отличает его от других стульев. Как то так.
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Класс — это шаблон, по которому можно создать объект (его также называют экземпляром класса или инстансом).
Представим, что у вас есть документация по самолету вместе с чертежом. Также представим, что будущий создатель самолета это компьютер (на самом деле это может быть не только робот, но и человек). В документации и чертеже четко описано как бы вы хотели, чтобы самолет выглядел, из чего состоял и что умел делать. Чертеж вместе с документацией — это класс. А конкретный самолет, созданный человеком или робот по конкретной документации с чертежом — это объект.
В классе вы указываете поля, которые вы хотели бы видеть, и функции, которые вы будете вызывать у созданного в дальнейшем объекта для определенных операций. Если у вас нет в классе статических полей, то вы не сможете вызывать метод или обратиться к полю, которое вы указали в классе. Только после директивы new или (после передачи ссылки на уже существующий объект в памяти), объект создается в оперативной памяти компьютера и вы можете обращатья к полям и методам. Данные для каждого созданного объекта уникальны (не в плане значений, ведь вы можете указать значения по-умолчанию в конструкторе или просто указать одни и те же параметры инициализации) в плане хранения в памяти. Даже если у вас два объекта с одинаковым значением поля, для компьютера эти поля находятся в разных местах памяти.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 2
программер
У @vdem Плохой, негодный пример!
У васи и маши есть общий метод — трахаться.
Однако, реализация (и, может быть даже, сигнатура) этого метода у них совершенно разные.
Тут налицо наличие базового абстрактногоо класса Человек с виртуальным методом трахаться.
И два унаследованных класа М и Ж, вообще говоря, с сильно разными интерфейсами.
Ответ написан более трёх лет назад
Нравится 5 2 комментария
Ну почему же, внутренняя реализация может быть и разная, но конечная цель (возвращаемое значение одно) что у М что у Ж ))
Классы и объекты
Класс в Java — это шаблон для создания объекта, а объект — это экземпляр класса. Класс определяет структуру и поведение, которые будут совместно использоваться набором объектов. Класс содержит переменные и методы, которые называются элементами класса, членами класса. Он составляет основу инкапсуляции в Java. Каждый объект данного класса содержит структуру и поведение, которые определены классом. Иногда объекты называют экземплярами класса.
Методы используются для описания того, что объект класса умеет делать или что можно с ним сделать. Переменные — для описания свойств или характеристик объекта.
Рассмотрим картинку, приведенную ниже. Объявлен класс Student , у которого есть переменные name и rollNo , а также методы setName() и setRollNo() для установки этих значений. На основе этого класса создано несколько объектов: Jenna, John, Maria, James. У каждого объекта, то есть студента, есть name и rollNo , но они разные.

2. Как создать класс в Java
Рассмотрим как создать класс в языке Java. Упрощенная общая форма определения класса:
class ИмяКласса < тип переменнаяЭкземпляра1; тип переменнаяЭкземпляра2; // . тип переменнаяЭкземпляраN; тип имяМетода 1 ( список параметров) < // тело метода >тип имяМетода2 (список параметров) < // тело метода >… тип имяМетодаN (список параметров ) < // тело метода >>
После ключевого слова class пишется имя класса. В теле класса объявляются переменные и методы класса. Их может быть сколько угодно.
Опишем класс для объекта Box (коробка). У коробки есть три главные характеристики: ширина, высота и глубина, описанные с помощью переменных:
public class Box
3. Создание объекта в Java
Объявление класса создает только шаблон, но не конкретный объект. Чтобы создать объект класса Вох в Java, нужно воспользоваться оператором наподобие следующего:
Вох myBox = new Вох();
При создании экземпляра класса, создается объект, который содержит собственную копию каждой переменной экземпляра, определенной в данном классе.
Создание объектов класса представляет собой двух этапный процесс:
-
Объявление переменной типа класса. Эта переменная не определяет объект. Она является лишь переменной, которая может ссылаться на объект:
Вох myBox;
myBox = new Вох();

После объявления объекта класса Box , всем переменным класса присваивается значение по умолчанию для заданного типа. Для того чтобы обратиться к переменной класса и изменить ее или получить значение, используется имя переменной объекта:
public class BoxDemo1 < public static void main(String[] args) < Box myBox = new Box(); // присвоить значение переменным экземпляра mybox myBox.width = 10; myBox.height = 20; myBox.depth = 15; // рассчитать объем параллелепипеда double volume = myBox.width * myBox.height * myBox.depth; System.out.println("Объем равен " + volume); >>
В следующем примере объявляется два объекта класса Box и каждому устанавливаются свои значения. Изменения в переменных экземпляре одного объекта не влияют на переменные экземпляра другого.
public class BoxDemo7 < public static void main(String[] args) < Box myBox1 = new Box(); Box myBox2 = new Box(); double volume; // присвоить значения переменным экземпляра myBox1 myBox1.width = 10; myBox1.height = 20; myBox1.depth = 15; //присвоить другие значения переменным экземпляра myBox2 myBox2.width = 3; myBox2.height = 6; myBox2.depth = 9; // рассчитать объем первого параллелепипеда volume = myBox1.width * myBox1.height * myBox1.depth; System.out.println("Объем равен " + volume); // рассчитать объем второго параллелепипеда volume = myBox2.width * myBox2.height * myBox2.depth; System.out.println(" Объем равен " + volume); >>
4. Присваивание переменным ссылок на объекты
Возможна ситуация, когда две переменные указывают на один и тот же объект в памяти:

Рассмотрим как это происходит на следующем примере.
При объявлении переменной b1 создается новый объект в памяти. При объявлении переменной b2 , вместо создания нового объекта, переменной присваивается ссылка на объект b1 . Далее объекту, на который указывает переменная b1 , присваиваются значения 10, 20, 30. А ширине объекта, на который указывает переменная b2 , присваивается значение 3:
public class BoxDemo6 < public static void main(String[] args) < Box1 b1 = new Box1(); Box1 b2 = b1; b1.width = 10; b1.height = 20; b1.depth = 15; b2.width = 3; System.out.println("Width: " + b1.width); System.out.println("Width: " + b2.width); >>
Но обе переменные указывают на один и тот же объект, поэтому результат выполнения этой программы будет:
Width: 3.0 Width: 3.0
5. Добавляем методы в класс
Кроме переменных класс может содержать методы. В следующем примере в класс Box добавляется два метода: getVolume() — для вычисления объема коробки и setDim() — для установки размера коробки. Обратите внимание, что теперь мы объявляем методы нестатические (без ключевого слова static). В обоих методах мы имеем доступ к переменным класса.
public class Box < double width; double height; double depth; /** * Подсчитать объем коробки * * @return Объем */ double getVolume() < return width * height * depth; >/** * Установить размер коробки * * @param w - ширина * @param h - высота * @param d - глубина */ void setDim(double w, double h, double d) < width = w; height = h; depth = d; >>
В следующей программе создаются два объекта класса Box и вместо инициализации каждой переменной класса, как мы делали ранее, вызывается метод setDim() , куда передаются необходимые значения для ширины, высоты и глубины. Таким образом программа становится более компактной. Нестатический метод класса всегда вызывается для какого-то объекта. Аналогично, для подсчета объема коробки вызываем метод getVolume() для каждого объекта отдельно:
public class BoxDemo2 < public static void main(String[] args) < Box myBox1 = new Box(); Box myBox2 = new Box(); myBox1.setDim(10, 20, 15); myBox2.setDim(1, 5, 5); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); >>
- Процедурное и объектно-ориентированное программирование
- Принципы ООП
- Конструктор
- Ключевое слово this
- Перегрузка
- Стек и куча
- Передача объектов в методы
- Java varargs
- Рекурсия
- Сборщик мусора и метод finalize
- Наследование
- Ключевое слово super
- Модификаторы доступа
- Геттеры и сеттеры
- Переопределение методов
- Абстрактные классы и методы
- Ключевое слово final
- Задания