Aunque es algo dependiente de la implementación particular del lenguaje (del compilador, el intérprete, la máquina virtual o lo que sea...), en muchos de los lenguajes que tienen sintaxis de objetos (¿la mayoría?, ¿todos?), tanto los métodos estáticos como los de instancia son compartidos en tiempo de ejecución (Java, C#, C++, Actionscript, etc, etc). Es decir, hay una sóla copia del código de la función / método en memoria, por clase. Lo único que cambia es que a un método de instancia se le pasa un parámetro adicional, implícito (generalmente es el primero), que es la referencia / puntero a this (a partir de cual se puede acceder al estado del objeto, o sea, a las variables o propiedades de instancia).
En algunos lenguajes, este parámetro se declara incluso explícitamente (aunque no se pasa en la llamada); creo que así era en Python, donde el primer parámetro de un método es self, si no recuerdo mal (no estoy seguro de si el nombre es una palabra reservada o sólo una convención).
Pero fuera de eso, los métodos estáticos o de instancia son iguales en ese punto (más allá de las diferencias semáticas o conceptuales, a nivel del lenguaje).
Un ejemplo para ilustrar esto último (completamente inútil a los fines prácticos, por lo demás).
Código PHP:
class Test {
public $id;
public function __construct($id) {
$this->id = $id;
}
public static function testStatic($explicitThis) {
return $explicitThis->id;
}
public function testInstance() {
return $this->id;
}
}
$a = new Test(1);
$b = new Test(2);
echo Test::testStatic($a) . ' - ' . $a->testInstance() . "<br>";
echo Test::testStatic($b) . ' - ' . $b->testInstance() . "<br>";
Saludos
Juan Pablo Califano