Hace java realmente punteros o no?

He buscado en google en busca de respuestas, pero no estoy satisfecho.

Mi Lógica:

Java utiliza las ubicaciones de la memoria, es sólo detrás de las escenas en las que usted no puede ver o acceder a ella (a mi conocimiento, probablemente hay formas de acceder a ellos que no sé).

Mi Confusión /Pregunta :

¿Cuál es el propósito de no tener punteros en un lenguaje de programación como Java, diseñado específicamente para el internet para ser utilizado en cualquier sistema, frente a un lenguaje de programación como c++, que hace uso de punteros?

Editar


Muchos de ustedes están diciendo: «mantenerlo simple». Si este es el caso, entonces ¿por qué un popular lenguaje de programación, como c++, el uso de punteros de todos modos?

  • La pregunta debería ser: ¿por qué no han de java «pasar por» el valor de los objetos
  • la pregunta es todavía el mismo concepto aunque
  • El «todo es un puntero, incluso si no se ve como una» decisión se remonta a Roble. Que el predecesor de Java fue diseñado para sistemas embebidos, no de Internet.
  • Pensé que el Roble era sólo de java, pero luego cambió de nombre debido a cuestiones de derechos de autor
  • Hubo algunos cambios reales de Roble para Java – fácil, entonces, porque no era ampliamente utilizado todavía. Pero los punteros no cambiar.
  • Todo en Java es «aprobada por el valor», sin embargo 🙂
  • «Si este es el caso, entonces ¿por qué un popular lenguaje de programación, como c++, el uso de punteros de todos modos?» – (1) debido a que C++ no tiene como su objetivo de diseño para «mantenerlo simple», y (2) porque C++ siempre había punteros, y la eliminación de ellos iba a romper el código existente
  • lo cierto es que
  • Me gustaría decir que C++ necesidades de los punteros en el fin de implementar cualquiera de sus funciones de asignación de memoria.
  • C++ necesidades de los punteros para un montón de razones 🙂
  • Entonces, ¿por qué no preguntar por qué todos los idiomas no son como C/C++? ¿Por qué existe o Haskell, Lisp o hacia Adelante? ¿Cuál es el propósito de OP pregunta?
  • Porque la memoria de la manipulación es un extra de preocupación al escribir una aplicación que no está realmente relacionado con la aplicación de la lógica de negocio. Al tomar distancia y dejar GC manejar, Java permite al programador centrarse exclusivamente en la aplicación de la lógica de negocio.
  • Java no tiene puntero del concepto, pero en realidad su ‘referencia’ concepto es el mismo, como C++ puntero. Por el bien de la simplicidad, de la dirección-de y eliminar la referencia se invoca implícitamente.
  • Una relacionada con la cosa que usted puede querer pensar en la biblioteca estándar que viene con el idioma. En C++ casi toda la biblioteca está escrito en el lenguaje mismo (creo que sólo algunos rasgos de tipo, de inicializador de listas y algunos límites numéricos requieren compilador de apoyo). Cómo es esto en Java? Se puede implementar en Java el String clase en Java sí mismo? (No sé lo suficiente acerca de él.)
  • Creo que C++ no es por la velocidad, ya que java hacer algunas pruebas y recolección de basura, que pueden disminuir el rendimiento un poco, mientras que C++ no tiene que hacer estas cosas, así que el código se ejecute más rápido.

InformationsquelleAutor Gabriel | 2011-11-10

9 Kommentare

  1. 65

    La respuesta simple es que es una decisión de diseño. El ligeramente respuesta larga es que los punteros en C++ sólo son necesarios para la manipulación de la memoria, que no es un concepto que se aplica a Java (ver más abajo).

    Java prevé una manera bastante sistemática, la programación orientada a objetos modelo, y todos los de la clase basada en los tipos son esencialmente siempre manejado a través de un puntero, y lo que este hecho no se expone para el usuario.

    Raw punteros en C++ no son muy necesarios en alta calidad, sistemática y modismos de programación, ya sea. Lo crudo punteros permiten realizar (a saber, la aritmética de punteros) es generalmente considerados «inseguros», y así es simplemente la izquierda de Java por completo.

    Nota por la forma en que muchas cosas que la gente intente hacer con punteros en C y C++ es en realidad un comportamiento indefinido. El uso de punteros correctamente te deja bastante con un conjunto limitado de opciones, la mayoría de los cuales se pueden hacer mejor en idiomáticas C++.

    Acerca de la única real uso de punteros es directo a la memoria de manipulación. Dado que Java no quiero que hagas eso (y de hecho, en su recolector de basura de la memoria de gestión interfieren activamente y ser roto por el manual de la manipulación de la memoria), no hay necesidad explícita de los punteros.

    Después de su actualización: El último párrafo es (en mi opinión), la más llamativa explicación: En C++ necesidad a ser capaz de escribir su propia memoria de gestión de código (cf. «asignadores»). Y la memoria ha para ser manejados a través de punteros. Así que mi estricta respuesta es que usted necesita punteros en C++ cuando se va a implementar la gestión de la memoria, y nunca de otro modo.

    • +1. Esta es la mejor respuesta.
    • excelente y en profundidad de la respuesta!
  2. 32

    Internamente una referencia a un objeto se implementa como un puntero. No hay aritmética de punteros, aunque…

    C++ tiene punteros, ya que está construido como un superconjunto de C, que tiene punteros. C tiene punteros ya que fue diseñado en los años 60. En esa época los equipos tenían muy poca memoria y punteros permitió la implementación de Cadenas, matrices y de paso de parámetros.

    Esto es un extracto del libro Blanco El Lenguaje Java Entorno:

    2.2.9 No Más Punteros

    La mayoría de los estudios están de acuerdo en que los punteros son una de las principales características que
    permiten a los programadores para inyectar errores en su código. Dado que
    las estructuras se han ido, y los arrays y cadenas son objetos, la necesidad de
    punteros a estas construcciones se va. Por lo tanto, Java no tiene puntero de datos
    tipos. Cualquier tarea que se requieren matrices, estructuras y punteros en
    C puede ser más fácil y fiable a cabo por declarar objetos y
    las matrices de objetos. En lugar de complejos puntero de la manipulación de la matriz de
    punteros, puede acceder a las matrices por sus aritmética de los índices. El Java
    sistema de tiempo de ejecución comprueba todos los de la matriz de indexación para asegurar que los índices están dentro de
    los límites de la matriz.

    Ya no tiene colgando punteros y arreglos en cuanto a la memoria, porque de punteros incorrectos, porque no hay punteros en Java.

    • internamente una referencia PUEDE SER implementado como un puntero. Si lo que ocurre realmente es dependiente de la implementación de la JVM, que no sea dictado por la JVM o especificaciones de lenguaje.
    • «C++ tiene punteros, ya que está construido como un superconjunto de C, que tiene punteros. C tiene punteros ya que fue diseñado en los años 60.» No. C/C++ los punteros porque son útiles. C/C++ todavía se utiliza en muchas situaciones en las que java estaría absolutamente fallar, es por eso que aún hoy en día, muy popular idiomas.
    • Eso es correcto! Yo creo que es el caso en la mayoría de las implementaciones.
    • No hay que olvidar que C++ fue originalmente llamado C con Clases. Y el requisito de la compatibilidad hacia atrás con C. Java es la evolución de C++.
    • Usted probablemente no verá la reacción de uno de los questionner reciente post «¿por Qué no Java reemplazar C++». No se trata de una «evolución», es un idioma diferente con diferentes aplicaciones.
    • Por qué no ha de C++ reemplazado C? No es C++ evolución de C? Los idiomas son muy persistente…
    • con buena razón. Muchos de los idiomas en que murieron, otras no, eso es porque son útiles. Si sólo desea código en java que está bien.
    • permítanos continuar esta discusión en el chat
    • También, JVM están codificados en C/C++ (stackoverflow.com/questions/1220914/…). Por lo tanto, C/C++ morir debería (si fuera cierto) ser de algún interés para usted.

  3. 17

    Java hace los punteros. De hecho, todo en Java es punteros (llamado referencias).

    Excepciones: int, boolean, char, etc.

    Ya que todo es de los punteros, sin necesidad de un asterisco para hacer una diferencia.

    • Punteros como en el acceso a los lugares de la memoria, la no modificación de datos, pero en realidad la visualización de la ubicación de memoria de un entero o algo
    • Hay algunas diferencias entre los punteros en C++ y las referencias en Java. Los punteros permiten a algunas de las operaciones aritméticas y de referencia no.
    • C y C++ no permite el acceso arbitrario ubicaciones de la memoria de cualquiera. La diferencia es que en C++ es un comportamiento indefinido, y puede bloquear el proceso o hacer cualquier otra cosa, mientras que en Java, el compilador se lo impide.
    • Que hacen. ¿Tal vez de decir, «¿por qué no java han puntero aritmética» ?
    • un comportamiento indefinido es sólo standardese para «no estamos especificando esto, pero podría hacer algo interesante». C fue diseñado como un lenguaje de programación de sistemas operativos y de los que habitualmente se utilizan punteros a ubicaciones arbitrarias, independientemente de lo que la norma nos dice que está permitido.
    • sí, y al hacerlo, usted se mueve más allá del lenguaje C, fuera de esa lengua garantías. El lenguaje C no permite el estiércol alrededor arbitrarias de memoria. Si lo hace, el programa ya no está bien definido por el estándar de C, incluso si funciona en la práctica
    • el estándar no es todo lo que hay a C. de lo Contrario, tendría que decir que el lenguaje de implementación de, por ejemplo, el kernel de Linux no es C, aunque claramente, que es (incluso si no es un dialecto estándar).
    • una referencia no es un puntero…
    • Estrictamente hablando, el kernel de Linux se basa en un comportamiento que, de acuerdo con el estándar de C, indefinido. Que significa que el comportamiento de la todo kernel está estrictamente hablando indefinido. No es un mal programa en C, pero es un indefinido uno. Se le puede llamar «C» o «C», lo que te hace feliz. Pero eso no cambiará que si juegas estrictamente por el libro, entonces todos los estándar de C tiene que decir sobre el kernel de Linux es que (1) es bien formado (o eso supongo, ya que podría depender no estándar de la sintaxis), un (2) su comportamiento es indefinido.
    • Y sí, el estándar ciertamente, es todo lo que hay a C. El lenguaje C es lo que es independientemente de lo que el kernel de Linux no. Lo que persona diría que define lo que C es, si no de la norma? Pero solemos decir que el kernel de Linux está escrito en C, ya que es una buena aproximación para ser útil
    • usted no puede tener una referencia a una referencia. tendría que crear algún tipo de objeto intermedio contener una referencia, por lo que al menos es una manera en la que una referencia no es un puntero.

  4. 7

    Primero, el problema obvio es que Java no es garantía de que un objeto permanece en la misma dirección a lo largo de su vida.

    Eficiente de los recolectores de basura que confiar en ser capaz de mover los objetos, y hacerlo invalidaría cualquier punteros que (antes), señaló que el objeto.

    Segundo, Java muy cerca de hace los punteros.
    C/C++ punteros no son exactamente lo que usted piensa.

    C++ puntero hace no permitir que usted acaba de apuntar a cualquier dirección de memoria y leer el contenido de la misma. No no permiten incrementar un puntero al final de una matriz.

    El lenguaje no tiene forma de detectar si hacer las cosas, y no hay manera de detectar el error al hacerlo. Pero eso no significa que no se permite. Es un comportamiento indefinido, y, en definitiva, podría hacer nada.

    Java muy cerca de hace los punteros. Aquí está casi lista completa de lo que legalmente se puede hacer con un puntero en C++:

    • eliminar la referencia para obtener la punta a objeto
    • acoplarlo por lo que apunta a un objeto diferente
    • hacer que un puntero null
    • si los puntos en una matriz, se pueden realizar aritmética de punteros, añadiendo o restando del puntero, tan largo como el resultado sigue siendo puntos en la misma matriz, o tomando la diferencia entre los dos punteros si ambos apuntan en la misma matriz.

    El último punto es realmente el único que no es posible en Java. Y es así mcuh más restringido que el de la gente suele pensar. No le da a usted una carta blanca para crear punteros a cualquier dirección antigua. No permite «acceder directamente a la memoria».

    Así que Java no tiene punteros porque:

    • sería muy difícil de aplicar correctamente en un GC ed lenguaje,
    • que tampoco requieren de algún grado de tiempo de ejecución de la comprobación (para garantizar que no válidos accesos a la memoria se detectan y tratan de forma segura), o tendría Java inseguro lenguaje, donde el comportamiento no es 100% especifica,
    • simplemente no hay mucho punto, porque los punteros permiten muy poca funcionalidad adicional, más allá de lo que Java referencias han
    • «C++ puntero no se permiten…» por Desgracia «permitir» que es un antónimo de «prevenir», así como un antónimo de «prohibir». C++ prohíbe intentar esas cosas, pero no impide que, como parte del potencial de un comportamiento indefinido cuando se rompen las reglas. Por lo que les permite en un sentido pero no en el otro.
    • No estoy de acuerdo. Seguramente «disallow» es una más correcta antónimo. «Prevenir» significa que algo no está permitida, y que este es forzada. Ni «permitir» o «denegar» dice nada acerca de si es forzada.
    • Usted está en desacuerdo con el diccionario, no sólo para mí, no voy a tratar de persuadir a creer.
    • Bien, «prevenir» puede ser el antónimo» si eso te hace feliz. Mi punto es que, lógicamente, el inverso de «permitir» es «rechazar». «Prevenir» significa algo más fuerte. «No permitir» significa que no está permitido hacer algo. «Prevenir» significa que está hecho imposible para que usted pueda hacer algo. Y seguramente, el opuesto de «permitido» es «no permitido»?
  5. 4

    Por la misma razón que java no tiene unsigned tipos. Los diseñadores de la lengua decidió no incluir en el fin de mantener el idioma «más simple».

  6. 3

    Ya que Java está destinado a ser un método simple, seguro y relativamente infalible lenguaje de programación. Los punteros son una herramienta afilada que la de Java diseñadores decidieron no poner en manos de los programadores.

    @oltarus es justo que, en un sentido, Java referencias son punteros, pero hay una diferencia importante: no se pueden hacer operaciones aritméticas sobre ellos, mientras que usted puede hacer aritmética de punteros. Aritmética de punteros es a la vez una fuente importante de errores con los punteros, ya que hacen punto en ubicaciones no válidas en la memoria (por ejemplo, al olvidar inicializar ellos, o a través de-por-uno de los errores).

    Actualización: C++ tiene punteros porque son necesarios para el tipo de sistemas de bajo nivel de programación que C++ fue diseñado para apoyar. C++ fue diseñado como un «mejor C» y un reemplazo para ese idioma, lo que significa que tiene todos los servicios necesarios para implementar cosas como los sistemas operativos y controladores de dispositivos. Haciendo que en un lenguaje sin punteros es prácticamente imposible.

    C y C++ seguir la filosofía que casi acceso completo al hardware, si usted lo pide, así que usted puede hacer prácticamente cualquier cosa que usted quiere que, pero el lenguaje también no dejar de hacer cosas estúpidas. Java, OTOH, restringe su acceso a la máquina mediante la ejecución de su programa en su VM sandbox.

  7. 3

    La razón principal es la verificabilidad. El bytecode de Java se define de manera que el gestor puede decidir en tiempo finito si el programa es seguro ejecutar. Aritmética de punteros no puede ser expresado en una forma que permite a esta verificación, por lo que fue retirado de la lengua, y sólo la asignación de las referencias de los restos.

    La misma restricción se aplica a la de C++/CLI; si el uso de ciertas expresiones en los punteros, el compilador no puede manifestar que el código que utiliza sólo bytecode de la «caja fuerte» y el componente no se carga si los controles están habilitados.

    La diferencia entre la CLI y el bytecode de Java es que Java no tiene un «seguro» conjunto de instrucciones, ya que fue diseñado específicamente para el código sospechoso en la Internet.

  8. 3

    En Java todos los objetos se asignan en el montón. Por lo que siempre se refieren a ellos con «punteros» (de ahí soltando la notación), a diferencia de C/C++, donde están los objetos, ya sea estáticamente o dinámicamente asignada.

  9. 1

    La razón principal es porque los punteros a llevar a muchos errores que muy difícil de identificar. En Java de la forma de vida de programador es más fácil.

    Actualizado pregunta: C++ con punteros tiene un mejor rendimiento que los de Java.

    • … o más, dependiendo de lo que desee hacer.
    • sí. es más sencillo para el apoyo de toneladas de código.
    • Los punteros no tienen nada que ver con C++ vs Java rendimiento. Si algo, los punteros son un inconveniente, porque hacen aliasing análisis muy, muy difícil para el compilador, que impide que una gran cantidad de útiles optimizaciones
    • Puedo comparar no aspecto de los punteros en el rendimiento, pero los dos idiomas. C++ tiene un mejor rendimiento que los de Java. ¿Quieres discutir?
    • Claro, me gustaría argumentar que es irrelevante. Porque la cuestión no era si C++ fue más rápido que Java, pero más bien ¿por qué Java no tiene punteros y C++. ¿Qué C++’s rendimiento tiene que ver con la pregunta?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea