Sunteți pe pagina 1din 5

Diferencia entre tipos primitivos y tipos de referencia en Java

Variables y Tipos

Una variable en Java es una localizacin de memoria que puede almacenar un valor
que puede cambiar en el transcurso de la ejecucin de un programa. El tipo de
informacin almacenado en una variable slo puede ser del tipo con que se declar esa
variable.

Una variable se declara usando la misma sintaxis de C. Por ejemplo, la siguiente tabla
indica una declaracin, el nombre de la variable introducida y el tipo de informacin que
almacena la variable:

Java posee dos grandes categoras de tipos para las variables:

Las variables de tipos primitivos almacenan directamente un valor que siempre


pertenece al rango de ese tipo. Por ejemplo, una variable int almacena un valor entero
como 1, 2, 0, -1, etc.

Esto significa que, al asignar una variable entera a otra variable entera, se copia el valor
de la primera en el espacio que ocupa la segunda variable.

Las variables de tipo referencia a objetos en cambio almacenan direcciones y no


valores directamente. Una referencia a un objeto es la direccin de un rea en memoria
destinada a representar ese objeto. El rea de memoria se solicita con el operador new.

Al asignar una variable de tipo referencia a objeto a otra variable se asigna la direccin
y no el objeto referenciado por esa direccin. Esto significa que ambas variables quedan
refenciando el mismo objeto.
La diferencia entre ambas asignaciones se observa en la siguiente figura:

Esto tiene implicancias mayores ya que si se modifica el objeto referenciado por r,


entonces tambin se modifica el objeto referenciado por s, puesto que son el mismo
objeto.

Nota:

En Java una variable no puede almacenar directamente un objeto, como ocurre en C y


C++. Por lo tanto, cuando se dice en Java que una variable es un string, lo que se quiere
decir en realidad es que la variable es una referencia a un string.

Resumen:

Este concepto no es nico de java ms bien a la programacin orientada a objetos. La


diferencias entre los tipos primitivos y los tipos de referencia es que las primitivas
reciben solo valores del tipo que son declaradas y las de referencia reciben solo
direcciones de memoria(lugar en la memoria donde est dicho valor).
EL MTODO EQUALS EN JAVA. DIFERENCIA ENTRE IGUALDAD E IDENTIDAD DE OBJETOS.

Recordemos ahora algo que hemos comentado antes: Un objeto es una cosa distinta a un tipo

primitivo, aunque porten la misma informacin. Vamos a tratar de profundizar y aclarar con ms

detenimiento la diferencia entre objetos y tipos primitivos. Para ello vamos a valernos de un smil:

consideremos que un objeto es una caja que puede contener muchas cosas (por ejemplo, un caldero, un
bolgrafo, un ventilador, etc.).

La variable que referencia al objeto sera una nota de papel donde tenemos escrito dnde se encuentra la
caja. Decimos que esta variable contiene una referencia o puntero al objeto.
En este ejemplo vemos cmo cuando usamos una instruccin como deposito1 = new Deposito();, en

realidad estamos creando dos cosas: la variable apuntadora denominada deposito1, que sera como

nuestra nota de papel que nos dice dnde est el objeto, y el objeto o espacio de memoria que queda

reservado. Para acceder al objeto hemos de usar la variable apuntadora. La memoria es como un gran

almacn con miles de cajas apiladas y si no sabemos dnde est una caja no podremos encontrarla. Cuando

creamos un tipo primitivo, creamos una sola cosa, pensemos por ejemplo que creamos un bolgrafo. Y ese

bolgrafo llevara una etiqueta con su nombre (nombre de la variable). Para gestionar tipos primitivos no

tenemos la duplicidad entre apuntador y espacio de memoria. Tenemos un espacio de memoria al que
podemos acceder directamente.

Por qu estas dos formas de gestionar la informacin? Por qu no almacenar todo de forma que

sea accesible directamente? La razn para ello estriba en la eficiencia de computacin: todo est pensado

para optimizar los rendimientos de los ordenadores y de los programas. Nosotros no tenemos por qu
profundizar en estas cuestiones, pero s conocerlas porque tienen relevancia de cara a la programacin.

Consideremos que cuando hacemos una peticin a la memoria, esta puede ser de dos tipos:

a) Le pedimos un tipo primitivo. Equivaldra a decir directamente Dame el bolgrafo 783. Y esta
informacin se nos sirve.

b) Le pedimos un objeto. Equivaldra a decir Dame la caja que est en la posicin 93282. Y esta
informacin se nos sirve.

Supongamos que mensaje7 es una variable apuntadora a una caja que contiene 2 bolgrafos, y que

estudiante451 es otra variable apuntadora a una caja que contiene otros 2 bolgrafos. Vamos a plantear

algunas preguntas:

PREGUNTA RESPUESTA RAZONAMIENTO

El contenido de mensaje7 es El objeto

est en posicin de memoria 08712,


Es idntico mensaje7 que No, no es
mientras que el contenido de
estudiante451? igual.
estudiante451 es El objeto est en
mensaje7 == estudiante451 False
posicin de memoria 93282. Por tanto
no son iguales.
Depende de qu consideremos ser igual.

Si consideramos que por contener 2

bolgrafos el contenido es igual la


Es igual el contenido de mensaje7
respuesta es s. Si consideramos que
que el contenido de estudiante451? Depende
adems hemos de comprobar que los
estudiante7.equals(estudiante451)
bolgrafos sean de la misma marca y

color, ahora mismo no sabramos decir si


los contenidos son iguales o no.

Llegamos a conclusiones importantes:

1) La comparacin usando == no se debe usar para comparar el contenido de los objetos, sino nicamente

para comparar la informacin de las variables apuntadoras. Usar == para comparar objetos es un error
frecuente en programadores con poca experiencia.

2) Para comparar el contenido de los objetos hemos de usar, en general, un mtodo especial del que

disponen todos los objetos denominado equals. Equals se basa en una definicin de igualdad que ha de

estar establecida. Por ejemplo, podramos definir que dos objetos son iguales si contienen el mismo nmero

de bolgrafos, de la misma marca, modelo y color. Para algunos tipos de objetos, como los String, la

definicin de igualdad que viene incorporada en el API de Java nos va a resultar suficiente. Es decir, if

(miCadena1.equals (miCadena2)) va a funcionar correctamente. Sin embargo, si hemos definido un tipo

Deposito y tratamos de utilizar if (deposito1.equals (deposito2)) no obtendremos un resultado satisfactorio


puesto que no hemos definido cul es el criterio de igualdad

S-ar putea să vă placă și