Ответ, выбранный лучшим, неверный. На самом деле, в нем попытались ответить на другой вопрос: являются ли значения, которые содержат переменные, ссылками на объекты, или примитивами. Оригинальный же вопрос был задан относительно переменных - слотов, временно или постоянно существующих в некоторых областях памяти: куче, стеке, регистрах CPU. Переменная является объектом тогда и только тогда, когда язык предоставляет программисту объектный интерфейс, состоящий из операций по управлению слотом этой переменной: создание нового слота, помещение значения в слот, удаление слота, извлечение текущего значения из слота, и т.д. Ни один из известных мне объектно-ориентированных языков программирования не предоставляет в явной форме такого объектного интерфейса для своих переменных. В этих языках операции создания слота (переменной), извлечения текущего значения и размещения нового реализуются специальными синтаксическими конструкциями языка, а не вызовом методов, как это могло бы быть:
SomeObject x; // Создание переменной x.
// Сравните с: Environment.getCurrent().createVariable("x")
x = 20; // Помещение значения в переменную.
// Сравните с: Environment.getCurrent().lookupVariable("x").assign(20)
x; // Извлечение значения переменной.
// Сравните с: Environment.getCurrent().lookupVariable("x").getValue()
А операция удаления слота и вовсе не доступна в явном виде программисту, как могла бы быть:
// Environment.getCurrent().free("x")
Чтобы лучше понять, как бы выглядела работа с переменными, будь они объектами, рассмотрим похожую проблему. Зададимся вопросом: а являются ли функции (или методы) объектами? Для Java/C#/C++ ответ отрицательный (если анонимные функции в C# имеют объектный интерфейс, просьба меня поправить). Но, скажем, в языке Scala, функции (и методы) и правда являются объектами, иными словами, они имеют объектные интерфейсы. К примеру, создадим новую функцию для двух аргументов, которую положим в переменную sum:
scala> val sum = (x: Int, y: Int) => x + y
sum: (Int, Int) => Int = <function2>
Созданная функция - объект, который является экземпляром некоторого класса:
scala> sum.getClass
res5: java.lang.Class[_ <: (Int, Int) => Int] = class $anonfun$1
Вызвать (применить) функцию можно традиционным способом:
scala> sum(5,6)
res6: Int = 11
А можно и с помощью объектного интерфейса:
scala> sum.apply(5,6)
res7: Int = 11
Создадим еще одну функцию, на этот раз с помощью явного создания объекта на основе интерфейса Function2, представляющего функции для двух аргументов:
scala> val mul = new Function2[Int,Int, Int] { def apply(x: Int, y: Int) = x * y }
mul: java.lang.Object with (Int, Int) => Int = <function2>
Полученная функция также является обычным объектом с методом apply:
scala> mul.apply(5,9)
res8: Int = 45
Еще один полезный метод, который предоставляет объектный интерфейс для функций - это операция карирования функции, которая позволяет вытворять такие вещи:
scala> val sum2 = sum.curried
sum2: Int => Int => Int = <function1>
scala> val inc = sum2(1)
inc: Int => Int = <function1>
scala> List(inc(7), inc(20), inc(35))
res10: List[Int] = List(8, 21, 36)
scala> val dec = sum2(-1)
dec: Int => Int = <function1>
scala> List(dec(7), dec(20), dec(35))
res11: List[Int] = List(6, 19, 34)
По аналогии, будь наши переменные объектами, мы бы могли обращаться к ним как к обычным объектам, вызывая их методы, как в случае с функциями. Но языки программирования не предоставляют такой возможности. Переменные в них НЕ являются объектами. В отличие от значений этих переменных. Путать эти два понятия не стоит.