Las referencias pueden implementarse almacenando la dirección. Por lo general, las referencias de Java se implementarán como punteros, pero eso no es requerido por la especificación. Pueden estar usando una capa adicional de indirección para permitir una recolección de basura más fácil. Pero al final (casi siempre) se reducirá a punteros (estilo C) involucrados en la implementación de referencias (estilo Java).
No puede hacer aritmética de puntero con referencias. La diferencia más importante entre un puntero en C y una referencia en Java es que en realidad no se puede obtener (y manipular) el valor subyacente de una referencia en Java. En otras palabras: no puedes hacer aritmética de punteros.
En C puede agregar algo a un puntero (es decir, la dirección) o restar algo para señalar cosas que están "cercanas" o señalar lugares que están en cualquier lugar.
En Java, una referencia apunta a una cosa y solo a esa cosa. Puede hacer que una variable contenga una referencia diferente , pero no puede simplemente pedirle que apunte a "la cosa después de la original".
Las referencias están fuertemente tipadas. Otra diferencia es que el tipo de referencia está mucho más estrictamente controlado en Java que el tipo de puntero en C. En C puede tener un int*
y convertirlo en ay char*
simplemente reinterpretar la memoria en esa ubicación. Esa reinterpretación no funciona en Java: solo puede interpretar el objeto en el otro extremo de la referencia como algo que ya es ( es decir, puede emitir una Object
referencia a String
referencia solo si el objeto señalado es realmente a String
).
Esas diferencias hacen que los punteros C sean más poderosos, pero también más peligrosos. Ambas posibilidades (aritmética de puntero y reinterpretación de los valores a los que se apunta) agregan flexibilidad a C y son la fuente de parte del poder del lenguaje. Pero son también grandes fuentes de problemas, ya que si se usan incorrectamente pueden romperse fácilmente suposiciones de que el código está construido alrededor. Y es bastante fácil usarlos incorrectamente.