Si Java no tiene punteros, entonces, ¿cuál es el new palabra clave hacerlo en Java?

  • Hay varios posts aquí que decir rotundamente «no, no realmente». Me pregunto – ¿de Java tiene alguna mecanismos (en módulos/extensiones?) para escribir en la memoria directamente, como en los viejos outb(0x08,0x378); o el viejo peek/poke en «pequeños Cpu» como la telefonía móvil.
  • SF, sol.misc.Clase inseguro (docjar.com/docs/api/sun/misc/Unsafe.html), que usted está buscando putByte método.
  • estrictamente hablando, eso no es «Java», porque no es estandarizado. Es un detalle de implementación de la JVM de Sun (y por lo tanto el OpenJDK así).
  • Java tiene la capacidad de llamar a los nativos (es decir, no Java) código. De esa manera usted puede hacer cualquier cosa que el código nativo no puede, pero no hay directo al hardware de acceso en Java.
  • Joachim Sauer, escuchar escuchar. Es JVM de Sun paquete específico apoyándose en un código nativo, sigue siendo parte de «Java» como una tecnología, pero en cuanto a lenguaje Java que se trate, no hay manera de manipular la memoria directamente. SF la pregunta era acerca de los módulos y extensiones, y este es uno de ellos.
  • java.lang.NullPointerException Esto por sí solo debería responder a todo. Creo que el alto número de upvotes respuestas aquí afirmando que java no tiene punteros, es el mejor argumento en contra de stackoverflow.

InformationsquelleAutor aruna | 2010-04-13

12 Comentarios

  1. 47

    Como se ha señalado, Java tiene referencias. De qué manera son diferentes ?

    1. no se puede realizar de la aritmética o de otras operaciones sobre estos
    2. que no apuntan a la memoria que contiene el objeto (es decir, no son punteros por otro nombre). La JVM es la libertad para mover los objetos dentro de la memoria de la máquina virtual, y lo más probable es que va a hacer durante la recolección de basura. Las referencias, sin embargo, todavía el punto a ese objeto, a pesar de su movimiento dentro de la memoria.

    Para que ellos no son como los de C++ referencias (apuntando directamente a un objeto). Quizás un mejor nombre sería manejar.

    • En realidad, a nivel de aplicación, referencias generalmente son punteros a la memoria que contiene el objeto. Sin EMBARGO, no hay manera de que un regular programa Java puede «mirar detrás de la cortina» y el uso de referencias como C-como punteros.
    • Puedes publicar una referencia a la anterior ? Dado que la JVM puede mover objetos a voluntad, y mantener sus referencias, yo sospecho que, al menos, una referencia sería un puntero a un puntero.
    • Allí, en realidad, es un famoso puntero, el NullPointer, que en mis aplicaciones, parece ser casado con una Excepción 🙂
    • que sería muy ineficiente. Cuando los objetos se mueven, la JVM sólo las actualizaciones de todas las referencias que apuntan a ella. (que no es tan suicidally caro como parece)
    • Interesante. ¿Tiene usted una referencia para ese comportamiento?
    • No, yo no. Pero si usted mira un libro de texto básico en el compilador de las implementaciones, y si se salta al capítulo sobre recolectores de basura, verás que esto se describe como el único cuerdo de hacer las cosas. Y no veo ninguna razón para creer que la JVM equipo habría elegido un menos solución eficiente que la que se describe en un compilador de aplicación 101 libro de texto para el segundo año de CS estudiantes… 🙂
    • Este es mera handwaving. Ya sea que usted realmente tiene una referencia que dice realmente, en cuyo caso usted debe publicar, según lo solicitado, o no, lo que deja espacio para la conclusión de que están haciendo. Yo miraba hasta tanto que mi compilador de aplicación 101 libros, uno de los cuales es Aho, Sethi, & Ullman, y ninguno de ellos dice cualquier cosa. La existencia de un lenguaje como el ‘logró puntero’ y ‘comprimido uy’ en la JVM documentos indica claramente que el objeto de las referencias son nada, pero la recta punteros.
    • así que tal vez a disponer de una fuente para su propio handwaving afirmación de que la JVM utiliza un eedlessly ineficiente aplicación de referencias? Porque de lo contrario se deja espacio a la conclusión de que están haciendo. No acabo de entender por qué usted piensa que una cita es necesario para la afirmación de que «porque hay un enfoque más eficiente, la JVM obviamente usa», pero la afirmación de que «a pesar de una alternativa fácilmente implementable y el enfoque más eficiente, JVM decide implementar el inferior enfoque ingenuo»
    • No tengo ni idea de lo que «comprimido oops», pero «puntero administrado» simplemente significa «un puntero cuyo valor es administrado por el tiempo de ejecución» (como ya he dicho, al actualizar el puntero del valor si, y cuando el objeto que apunta es movido). ¿Tiene usted una referencia diciendo que «el administrado puntero es un puntero a un puntero»?
    • Votada abajo ¿por qué ?
    • No estoy dudando de ti en particular, pero que le gustaría encontrar alguna referencia que la verdad describe lo que está pasando
    • href=»http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html» >referencia. Sin embargo, (1) yo no he dicho «un administrado puntero es un puntero a un puntero» (aunque lo más un ‘puntero administrado» podría ser, es otra cuestión); (2) todavía es necesario proporcionar cualquier referencia a todos los que (a) satisface la descripción de su «un compilador de aplicación 101 libro de texto para el segundo año de CS estudiantes» y (b) apoye su reclamación. Miré el más conocido y no lo encontramos. Estas son sus declaraciones. El apoyo de ellos.
    • ¿por casualidad leer su «referencia»? Porque dice: «gestión de los punteros en el almacenamiento dinámico de Java punto a objetos, los cuales están alineados en 8 bytes de la dirección de fronteras», que es precisamente lo que he dicho: Java punteros o referencias apuntan directamente a los objetos en el heap. Es hasta la GC para, a continuación, guardarlos en la sincronización de si/cuando se mueve un objeto. Y no, lo siento reventar su burbuja, pero no es de la incumbencia de mí» para que le enseñe los compiladores de trabajo. Yo… no… cuidado. Si usted quiere creer que los diseñadores de la JVM quería para hacer que sea más lento de lo necesario, no dude en. No. Mi. Problema.
    • «Las referencias, sin embargo, todavía el punto a ese objeto, a pesar de su movimiento dentro de la memoria». – Yo soy muy nuevo en esto, pero es posible que la referencia que usted habla de que puede ser otro puntero?
    • Me gustaría leer los comentarios de arriba! He planteado esto como una posibilidad, y ha estimulado una gran cantidad de calor, y relativamente poca luz

  2. 38

    Java no tiene punteros; Java tiene referencias.

    Es un punto fino, pero un puntero tiene más operaciones que puede (o no) suelen utilizar; una referencia carece de estas operaciones debido a que las operaciones pueden ser inseguras.

    Por ejemplo, si utiliza un puntero para el índice del primer elemento de una matriz así:

    int squares[] = {1, 4, 9, 16, 25, 36, 49};
    int* intPointer = squares;

    usted lo desea, puede eliminar el puntero y obtener el valor «1», pero también puede:

    intPointer++

    y después de hacerlo, cuando de eliminar el puntero se obtendrá el valor «4». Un segundo

    intPointer++;

    cuando se eliminan las referencias, darle el valor «9». Esto es debido a que el ++ operación se mueve el puntero de una «unidad» por delante en la memoria.

    El problema viene de las debilidades en la C /C++ validación de tipos de sistema (C++ debe mantener la compatibilidad con C, por lo que permite a los mismos problemas). El puntero almacena una dirección de memoria y el ++ operación añade el número de bytes a la dirección. En muchos sistemas ++ing int suma cuatro bytes, pero si el puntero fue un char puntero ++ing sólo debe añadir un byte. Tenga en cuenta que dado el tipo de datos subyacente de un puntero es una dirección en la memoria, el siguiente es legal (pero no recomendable):

    char* charPointer = squares;
    charPointer++;
    
    void* voidPointer = squares;
    voidPointer++;

    Ya que los punteros a direcciones de memoria, que pueden representar (correctamente) cualquier bit de memoria en el equipo, pero sólo están correctamente cuando se eliminan las referencias a los datos subyacentes maches el tipo y la alineación del puntero. Para los punteros que no son administrados por un montón de código para hacerlas seguras, esto significa que usted podría desviarse el tipo de datos (o de alineación) de la información deseada y eliminar podría terminar en un desastre. Intentar arreglar este problema con el código personalizado tiende a frenar uno de los punteros suficientemente graves observa problemas de rendimiento, y abre las puertas para la adición de errores en la costumbre «puntero» gestión de código.

    Lado de Java pasos de todos estos problemas mediante la devolución de una referencia. Una referencia no hace referencia a la ubicación en la memoria; Java mantiene una interna «de referencia» puntero de la tabla. Esta tabla toma la referencia y devuelve los datos asociados con ella, siempre que los datos pueden residir en la memoria. Esto ralentiza la ejecución de código, debido a que dos de búsquedas se realizan para cada uno de los «eliminar», una búsqueda en la tabla de referencia, uno en la memoria de la máquina.

    Una gran ventaja de Java utilizando las referencias es que la memoria puede ser movida sin romper el puntero de direcciones. En un programa en C, si mover los datos a una nueva ubicación de memoria, es muy difícil saber si en alguna otra parte del programa tiene un puntero a los datos. Debe un rancio puntero se eliminan las referencias después de la memoria se mueve, el programa tendrá acceso a los datos corruptos, y, normalmente, un accidente puede ser inconveniente.

    La capacidad para mover la memoria en un programa en ejecución permite que los programas recicle fácilmente de la memoria. Cualquier programa que no necesita pedazos de memoria puede liberar la memoria no utilizada, pero esto crea la memoria de los agujeros de la memoria no utilizada entre los fragmentos de la memoria utilizada. Internamente las computadoras utilizan las páginas de la memoria, que son bastante grandes. Si una región escasamente utilizado la página de la memoria podría tener el par de bits utilizados trasladado a otra página, una página de memoria puede ser liberada. Esto aumenta la densidad de los datos en la memoria, mejorar el rendimiento de la caché. A veces esto se traduce en mejoras de rendimiento que puede ser muy dramático.

    Recolector de Basura de Java tiene la ventaja de la utilización de referencias temporalmente el bloqueo de acceso a los datos para un conjunto de referencias. Durante ese bloqueo de acceso, mueve los datos a su alrededor (para compactar). Después de la obstrucción, la referencia a la tabla de direcciones tiene el nuevo direcciones de memoria. Desde la «funcional» de la capa del código nunca sabía las direcciones, en primer lugar, esta operación no va a romper en ejecución un programa de Java.

    • Micro-pequeñeces: «C++ debe mantener la compatibilidad con C» no es exactamente cierto, no son varios (pequeño-ish) incompatibilidades. «C++ se esfuerza por mantener la compatibilidad con C» es el más correcto.
    • No tan micro pequeñeces: La «referencia a puntero de la tabla» que usted menciona es una implementación posible, pero de ninguna manera requerida por la especificación de Java.
    • No hay problema con la molestia, pero de alguna manera la referencia eventualmente tendrá que ser convertida en una dirección. Un puntero de la tabla es la más lógica de hacerlo, pero tienes razón, otros medios podría existir. El puntero de la tabla no es un requisito, pero sin algún tipo de búsqueda, usted está tratando con algo generados algorítmicamente, lo que difícilmente va a ayudar con la compactación de la memoria.
    • no es lo más lógico para hacer sólo la creación de un puntero a la punta de los datos? Acabo de actualizar los punteros cuando se mueve una punta a objeto durante una recolección de basura
    • Es lo lógico, pero es propenso a los problemas. Básicamente, los valores de puntero puede ser copiado en varios lugares, así que a menos que tengas algún tipo de exótico «de la pista cada vez que este puntero del valor se ha copiado, y mantener una referencia de todos aquellos valor de ubicaciones, incluyendo el seguimiento de si algunos de esos lugares son destruidos a lo largo del tiempo», a continuación, voy a actualizar sólo algunos de los valores de puntero (lo que sería muy malo). De hecho, usted realmente no puede incluso crear un sistema; ya que, algunos de estos valores puede ser transmitida entre los programas. Con una referencia a un puntero de la tabla, en un sólo lugar.
    • ¿Cuáles son las otras posibles implementaciones para resolver el «tipo de referencia <-> objeto»?
    • No hay aritmética de punteros en void* o implícita int* a char* conversión en C++.
    • «un puntero extra de operaciones» — no necesariamente. En C y C++, punteros extra operaciones. Pascal también tiene punteros, pero no aritmética de apuntadores.
    • También: «Un puntero es una dirección». No, no, no. Es generalmente implementados como la dirección (pero también lo son, por ejemplo, C++ referencias, que definitivamente no son punteros). Pero no hay ninguna obligación de hacerlo. E incluso si se implementa como una dirección, en C y C++ con la aritmética de punteros, la adición de un número a un puntero no significa generalmente que añadir el número a la dirección.
    • En que lenguaje de programación es un puntero no es un contenedor de la memoria de una dirección?
    • Por ejemplo, en C++. Sí, en el 99,99% de todas las implementaciones, el puntero es en realidad implementado como una simple dirección. Pero no hay nada en la norma que lo exige. Y por otra parte, las reglas de los punteros significa que si usted confía en el puntero a ser «nada más que una dirección», usted puede estar adentro para sorpresas cuando el optimizador se decide a hacer una optimización que rompe la asunción (aliasing).
    • El estándar de C++, borrador de trabajo de 2012 … 1.8 (La de C++, object model) (párrafo 6, frase 1) «a Menos que un objeto es un poco de campo o una clase base subobjeto de tamaño cero, la dirección de ese objeto es la dirección del primer byte ocupa» También 2.7.4.1 Asignación de funciones (párrafo 2, frase 5) «El puntero devuelto deberá ser adecuado alinea de modo que puede ser convertido a un puntero de completar cualquier tipo de objeto con un fundamento requisito de alineación» yo diría que esto, combinado con los detalles del modelo de memoria significa que C++ punteros contienen direcciones.
    • No. Sólo significa que contienen información que puede ser usada para obtener la dirección de memoria. Por ejemplo, podrían ser implementado como un índice en una tabla global, y un desplazamiento (el último, de ser necesario, debido a la aritmética de punteros). Que de acuerdo a otras respuestas, aparte de que el desplazamiento es exactamente la forma en Java referencias se aplican en la práctica. Java del curso no requiere un desplazamiento porque no tiene aritmética de punteros, y sus campos de objeto son todos los tipos que no pueden ser señaladas.
    • Que parte de «la dirección de ese objeto es la dirección del primer byte» especificación explicación significa «de la dirección de que el objeto es algo que usted puede utilizar para obtener la dirección del primer byte»? Yo fui directamente a citar el estándar de C++. Cuál es tu referencia?

  3. 13

    Java tiene punteros en el sentido de las variables que almacenan referencias a los datos en la memoria. Todas las variables de los tipos de Objetos en Java son punteros en este sentido.

    Sin embargo, el lenguaje Java no permite que las operaciones aritméticas en los valores de los punteros, como usted sería capaz de hacer en un lenguaje como C.

    • «manipulación directa» es una especie de en-preciso: la Cesión de otro valor (= otro de referencia) es posible, pero la aritmética de punteros (es decir, sumar 1 al puntero) no es posible.
    • Buen punto. Fijo.
    • Lo que significa que si las operaciones aritméticas con los punteros no son permitidos, no significa que no hay punteros en Java.
  4. 7

    new hace (más o menos) lo siguiente:

    1. Encontrar una libre contiguo de bloques de la memoria heap igual al tamaño de la instancia de la clase que estamos creando, además de algo de espacio para la contabilidad
    2. Cero dicho espacio & eliminarlo de la lista libre
    3. Ejecutar el constructor
    4. Devolver una referencia (NO es un puntero, como de otros puestos, ha explicado a) a la creación de la instancia.
    • Perspicaz hecho.
  5. 4

    Java hace los punteros, que son conocidos bajo el nombre de «referencia«.

    Cuando la gente dice «Java no tiene punteros», se suele confundir el concepto de un puntero con la aplicación concreta y habilidades de los punteros se encuentra en C y C-lenguajes derivados.

    En particular:

    • Java referencias no se puede establecer una dirección arbitraria. Ni puede (estándar) Pascal ni Fortran punteros.
    • Java referencias no se puede establecer para que apunte a una variable. Ni puede (estándar) Pascal punteros.
    • Java referencias no apoyar la aritmética de punteros. Ni Pascal ni Fortran punteros
    • Java referencias no puede señalar partes de un objeto (como el tercer elemento de una matriz). Ni puede Pascal punteros.

    También, contrario a la creencia generalizada, un puntero es no necesariamente una dirección. Un puntero es típicamente implementado como una dirección, pero no hay ninguna obligación de hacerlo, ni siquiera en C o C++.

    • Creo que la confusión viene del hecho de que «puntero» es un término casi universalmente asociado con C/C++. Como resultado la mayoría de las personas de obtener un mejor entendimiento de la declaración que hace el Java no los punteros. Todavía: upvote.
    • Esta es la mejor respuesta aquí. Me gustaría poder upvote más.
  6. 3

    java.lang.NullPointerException

    Gente me dijo «que java no tiene punteros» en las entrevistas.
    Yo normalmente les dio un poco de código java y vamos a explicar, lo que está sucediendo en este código:

    public class TestPointers {
    
        public static void main(String args[]) {
            Object p1, p2;
            p1 = new Object();
            p2 = p1;
            p1 = null;
            System.out.println(p2);
        }
    }
    • Hoy he tenido la primera Java conferencia y estoy exactamente perplejo por este ejemplo. Por qué todo el mundo dice que Java tiene referencias?! Lo costuras a mí es que todo lo que es puntero, pero usted no puede hacer aritmética de apuntadores.
    • Estás en lo correcto. y estoy confunden acerca de la existencia de Puntero. Puede usted ayudar a resolver esta confusión. me dan algún enlace o código.
    • Lo que pasa es que estás declarando dos objetos en la primera línea. En la segunda línea de inicializar p1, a continuación, en el tercer renglón se establece p2 igual a p1. Finalmente se hacen p1 referencia null. p2 voluntad(y debe), sigue igual el new object().
    • No entiendo muy bien esta respuesta. El hecho de que p2 tiene un valor al final del ejercicio y no es null demuestra que Java, de hecho, no tiene punteros de lo contrario p2 apuntaría a p1 y ser null así.
    • por favor, todos los que todavía no está claro acerca de esto, google el nombre de la clase mencionada al principio de esta respuesta.
    • No, no, porque al modificar p1 que hacen referencia a null, pero no destruir el objeto; el objeto y su referencia son cosas distintas: p2 todavía apunta al objeto creado, hasta p2 referencia null; entonces, el objeto va a ser destruido por la GC porque no hay nada que haga referencia a ella. C punteros son similares en este: considere el código void main() { int n, *p1, *p2; n = 42; p1 = &n; p2 = p1; *p1 = 100; p1 = NULL; printf(«%d\n», *p2); } se imprimirá «100» porque cuando haces p1 = null, modificar el valor del puntero, no el valor de lo que se señala.
    • No sé de ningún tipo de lenguaje que tiene punteros donde los punteros del mismo tipo punto a otro (por ejemplo, int* en C no punto a otro int*, que apunta a una int), así que no entiendo tu prueba, que se basa en la propuesta que p2 apuntaría a p1 en cualquier idioma con punteros.

  7. 1

    Java tiene referencias. Todos los objetos se accede a través de tener referencias a sus instancias. Crear una nueva instancia en el uso de new, que devuelve una referencia al objeto.

    Java referencias no son como los punteros en C, no se puede «mirar bajo el capó» en el raw de la memoria, que hace que el objeto.

    • «Mira bajo el capó» no es una propiedad de los punteros. Es una propiedad de la lengua; en particular, en C y C++ se puede «mirar bajo el capó», debido a que (1) cualquier puntero puede ser convertido a un puntero a char (tipo de conversión no es una propiedad inherente de los punteros), (2) char está garantizado para asignar directamente a la máquina de bytes (que es bastante obvio que no es un puntero a la propiedad) y (3) C y C++ han aritmética de punteros (de nuevo, no es un puntero genérico rasgo, pero una característica específica de los idiomas).
  8. 0

    new devuelve una referencia. tiene algunas similitudes con punteros (si se pasa a la función, la referencia se pasa, lo mismo que con el puntero), pero no hay aritmética de punteros.

  9. 0

    Java no tiene Punteros. El operador «new» se utiliza para la variable de referencia en java.

    • Esto es claro. Cómo es el operador new relacionados en cualquier forma esencial a las variables en todos los? Por ejemplo, si se ejecuta la System.out.println(new String("hello"));, que utiliza new, donde es la «variable de referencia»?
  10. 0

    Java no apoyar o permitir a los punteros. (O, más propiamente , Java no soporta punteros que se puede acceder y/o modificadas por el programador.) Java no puede permitir que los punteros, ya que esto permitiría a los applets de Java para el incumplimiento del firewall entre el entorno de ejecución de Java y el equipo host. (Recuerda que un puntero puede ser dada en cualquier dirección de la memoria – incluso las direcciones que puede estar fuera de la de Java en tiempo de ejecución del sistema.)

    • Eso no es una propiedad de los punteros, que es una propiedad de los lenguajes específicos que apoyan a los punteros (en particular, C y C++). Pascal soporta punteros, pero (salvo como extensión no estándar por varios compiladores) no admite dando un puntero a una dirección arbitraria. De hecho, ni siquiera el apoyo de apuntar a una variable; la única manera de conseguir punteros en Pascal es a través de la new o mediante la asignación de un puntero a otro.
    • Eso no es una propiedad de los applets, que puede hacer valer las excepciones en la mala memoria de los accesos, tanto como segfaults. Los programas en general, con punteros, no sólo puede acceder a cualquier dirección en la memoria, porque el sistema operativo bloques.
  11. 0

    En java nos encontramos con ciertas palabras clave utilizadas como referencia por ejemplo this palabra clave se utiliza para referirse a las variables de la misma clase. El operador new se utiliza como referencia a un objeto.

    • ‘esto’ no es más que un puntero que cualquier otra variable. Simplemente permite una explícita referencia al objeto actual.

Dejar respuesta

Please enter your comment!
Please enter your name here