Las referencias pueden implementarse almacenando la dirección. Generalmente Las referencias de Java se implementarán como punteros, pero eso no es requerido por la especificación. Es posible que estén usando una capa adicional de direccionamiento indirecto 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 se puede hacer aritmética de punteros con referencias. La diferencia más importante entre un puntero en C y una referencia en Java es que realmente no se puede llegar (y manipular) el valor subyacente de una referencia en Java. En otras palabras: no se puede 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 "cerca" o para señalar lugares que están en cualquier lugar.
En Java, una referencia apunta a una cosa y solo a esa cosa. Puedes hacer que una variable contenga una referencia diferente , pero no puedes simplemente pedirle que señale "lo que está detrás de lo original".
Las referencias están muy escritas. Otra diferencia es que el tipo de referencia es mucho más controlado de forma más estricta en Java que el tipo de puntero en C. En C puede tener un int*
y convertirlo en un char*
y simplemente volver a interpretar 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 está (es decir, puede convertir una referencia Object
a String
reference solo si el objeto señalado es en realidad un String
).
Esas diferencias hacen que los punteros C sean más potentes, pero también más peligrosos. Ambas posibilidades (la aritmética de punteros y la reinterpretación de los valores a los que se apunta) agregan flexibilidad a C y son la fuente de algunos del poder del lenguaje. Pero son también grandes fuentes de problemas, porque si se usan incorrectamente, pueden romper fácilmente las suposiciones sobre las que se basa su código. Y es bastante fácil usarlos incorrectamente.