Solicitud de traducción informática de caracteres chinos extranjeros en 2000

Chino:

Aunque está basado en C, Java es un lenguaje de programación más puramente orientado a objetos.

Tanto C como Java son lenguajes híbridos. Pero en Java, los diseñadores sienten que esta mezcla es menos importante que en C. Los lenguajes mixtos permiten múltiples estilos de programación; C es un lenguaje mixto porque admite compatibilidad con versiones anteriores del lenguaje C. Porque C es un superconjunto de C y contiene muchas características que este último no tiene, lo que hace que C sea demasiado complejo en algunos lugares.

El lenguaje Java primero supone que solo queremos hacer programación orientada a objetos. En otras palabras, primero debes cambiar de opinión hacia un mundo orientado a objetos antes de usarlo para el diseño formal (a menos que ya estés acostumbrado a la forma en que piensa este mundo). Sólo haciendo estos preparativos podrá darse cuenta de que Java es fácil de aprender y usar en comparación con otros lenguajes de programación orientada a objetos. A continuación, analizaremos los componentes básicos de un programa Java y comprenderemos por qué todo en Java, e incluso los programas Java, son objetos.

Usa tiradores para manipular objetos.

Cada lenguaje de programación tiene su propio enfoque en el procesamiento de datos. A veces, los programadores siempre deben ser conscientes de con qué tipo están tratando. ¿Alguna vez ha utilizado alguna sintaxis especial para operar objetos directamente o ha tratado con algunos objetos representados indirectamente (punteros en C o C)? Todo esto está simplificado en Java, todo puede considerarse como un objeto. Entonces podemos usar una gramática unificada y plagiar en todas partes. Pero es importante tener en cuenta que, si bien todo se "considera" un objeto, los identificadores que se manipulan son en realidad "identificadores" que apuntan a objetos. En otros libros de referencia de Java, también puede ver personas que lo llaman "referencia" o incluso "puntero". Esta situación se puede imaginar como si se utilizara un panel de control remoto (mango) para controlar un televisor (objeto). Mientras sostengas este panel de control remoto, equivale a dominar el canal conectado al televisor. Pero una vez que necesitamos "cambiar el canal" o "bajar el sonido", en realidad controlamos el panel de control remoto (mango), y luego el panel de control remoto controla el televisor (objeto). Si desea moverse por la habitación y mantener el control del televisor, debe sostener el control remoto, no el televisor. Además, el panel de control remoto puede sostenerse por sí solo incluso sin un televisor. En otras palabras, sólo porque tengas un identificador no significa que necesariamente haya un objeto conectado a él. Entonces, si desea guardar una palabra u oración, puede crear un identificador de cadena:

String s;

Pero lo que se crea aquí es solo un identificador, no un objeto. Si envía un mensaje a S en este momento, obtendrá un error (tiempo de ejecución). Esto se debe a que el S en realidad no está conectado a nada (es decir, "no hay TV"). Por lo tanto, es más seguro crear un identificador y recordar inicializarlo de todos modos:

String s = " asdf

Sin embargo, aquí se utiliza un tipo especial: las cadenas se pueden inicializar con comillas text. Generalmente, debe usar un tipo de inicialización más general para los objetos.

(2) Todos los objetos deben crearse al crear identificadores. Normalmente se usa el nuevo. palabra clave para este propósito. Nuevo significa: "conviérteme en un nuevo tipo de estos objetos". Entonces, en el ejemplo anterior, podríamos decir:

String s = new string("asdf"); p>

No solo señala "conviérteme en una nueva cadena", sino que también señala que al proporcionar una cadena inicial "Cómo generar esta nueva cadena". Lo más importante que debemos recordar es que podemos crear nuestros propios tipos en programación Java. Una operación básica que es la base para continuar con el resto de este libro.

Cuando el programa se está ejecutando, debemos hacerlo. preste especial atención a la asignación de memoria. Hay seis lugares para guardar datos.

Registro.

Esta es el área de almacenamiento más rápida porque está ubicada en una ubicación diferente a la de todos los demás métodos de almacenamiento: dentro del procesador. Sin embargo, el número de registros es muy limitado, por lo que el compilador asigna registros según sea necesario. No tenemos control directo sobre esto y es imposible encontrar ningún rastro de la existencia de registros en nuestros programas.

Pila. Reside en un área RAM (memoria de acceso aleatorio) normal, pero recibe soporte directo para el procesamiento a través de su "puntero de pila". Si mueve el puntero de la pila hacia abajo, se crea nueva memoria; si lo mueve hacia arriba, la memoria se libera. Esta es una forma particularmente rápida y eficiente de guardar datos, solo superada por los registros. Al crear un programa, el compilador de Java debe conocer exactamente la "longitud" y la "antigüedad" de todos los datos almacenados en la pila. Esto se debe a que tiene que generar el código apropiado para mover el puntero hacia arriba y hacia abajo. Esta limitación sin duda afecta la flexibilidad del programa, por lo que aunque algunos datos Java deben almacenarse en la pila, especialmente los identificadores de objetos, los objetos Java no se colocan en ella.

Heap un grupo de memoria general (también en el área de RAM) que almacena objetos Java. A diferencia de la pila, lo más atractivo del "montón de memoria" o "montón" es que el compilador no necesita saber cuánto espacio de almacenamiento asignar del montón, ni cuánto tiempo permanecerán los datos almacenados en el montón. Por lo tanto, obtendrá más flexibilidad al utilizar el montón para guardar datos. Cuando desee crear un objeto, simplemente use el nuevo comando para compilar el código relevante. Cuando se ejecutan estos códigos, los datos se guardarán automáticamente en el montón. Por supuesto, esta flexibilidad tiene un precio: ¡se necesita más tiempo para asignar almacenamiento en el montón!

Almacenamiento estático. "Estático" aquí significa "en una ubicación fija" (aunque también está en la RAM). Durante la ejecución del programa, los datos almacenados estáticamente estarán esperando ser llamados en cualquier momento. Puede utilizar la palabra clave estática para indicar que un elemento específico de un objeto es estático. Pero los objetos Java en sí nunca se guardan en un almacenamiento estático.

Almacenamiento constante. Los valores constantes generalmente se colocan directamente en el código del programa. Esto es seguro porque nunca cambian. Algunas constantes necesitan una protección estricta y se puede considerar que están ubicadas en la ROM.

Almacenamiento sin RAM. Si los datos son completamente independientes de un programa, entonces el programa aún puede existir cuando no se está ejecutando y no está controlado por el programa. Los dos ejemplos más importantes son los "objetos de flujo" y los "objetos fijos". Para los objetos de flujo, el objeto se convierte en un flujo de bytes, generalmente enviado a otra máquina. Para objetos fijos, el objeto se guarda en el disco. Incluso si los programas dejan de ejecutarse, aún pueden mantener su estado. Un consejo particularmente útil para este tipo de almacenamiento de datos es que pueden existir en otros medios. Incluso se pueden restaurar a objetos normales basados ​​en RAM una vez que sean necesarios. Java 1.1 proporciona soporte para persistencia ligera. Las versiones futuras pueden incluso ofrecer una solución más completa.

(3) Números de alta precisión

Java 1.1 agrega dos clases para cálculos de alta precisión: enteros grandes y números grandes y pequeños. Aunque se pueden dividir en términos generales en tipos "envoltorios", ninguno de ellos tiene un "tipo principal" correspondiente.

Ambas clases tienen sus propios "métodos" especiales que corresponden a las operaciones que realizamos en el tipo principal. En otras palabras, lo que se puede hacer con int o float también se puede hacer con números enteros grandes y con números grandes y pequeños. Sólo necesita utilizar llamadas a métodos, no operadores. Además, debido a que hay más involucrados, la velocidad de cálculo será más lenta. Sacrificamos velocidad pero ganamos precisión.

Los enteros grandes admiten números enteros de precisión arbitraria. En otras palabras, podemos representar con precisión valores enteros de cualquier tamaño sin perder ninguna información durante la operación.

Los números grandes y pequeños admiten números de punto fijo con precisión arbitraria. Por ejemplo, puede utilizarse para cálculos monetarios precisos.

En cuanto a los constructores y métodos que se pueden utilizar al llamar a estas dos clases, consulte la documentación de ayuda en línea.

(4)Matriz Java

Casi todos los lenguajes de programación admiten matrices. Usar matrices en C y C++ es muy peligroso porque esas matrices son solo bloques de memoria.

Si el programa accede a la matriz en lugar de a su propio bloque de memoria, o usa la memoria antes de la inicialización (errores de programación comunes), se producirán consecuencias impredecibles.

Uno de los principales objetivos de diseño de Java es la seguridad. Muchos problemas que preocupan a los programadores en C y C ya no se repiten en Java. Se garantiza que Java se inicializará y no se podrá acceder a él fuera de su alcance. Debido a que el sistema verifica automáticamente el rango, tiene que pagar un precio: hay una pequeña sobrecarga de memoria para cada matriz y para verificar el índice durante la operación. Pero a cambio de mayor seguridad y mayor eficiencia en el trabajo. Vale la pena pagar un poco por ello.

Cuando creas una matriz de objetos, en realidad creas una matriz de identificadores. Cada identificador se inicializa automáticamente con un valor especial con su propia palabra clave: nulo. Una vez que Java ve nulo, sabe que el identificador no apunta a un objeto. Antes de que el objeto pueda usarse formalmente, se debe asignar un objeto a cada identificador. Si intenta utilizar un identificador que todavía está vacío, se informará del problema en tiempo de ejecución. De este modo, se evitan los errores típicos de matrices en Java.

También puedes crear arrays de tipos principales. De manera similar, el compilador puede garantizar su inicialización porque dividirá la memoria de la matriz en ceros.

(5) Nunca limpie objetos.

En la mayoría de los lenguajes de programación, la "vida útil" de las variables siempre ha sido un tema en el que los programadores deben centrarse. ¿Cuánto tiempo debe durar la variable? Si se va a purgar, ¿cuándo se podrá hacer? Obsesionarse con la antigüedad de las variables conduce a una gran cantidad de errores en el programa. En la siguiente sección, explicaremos cómo Java nos ayuda a realizar todo el trabajo de limpieza, simplificando así enormemente este problema.

Ámbito de Acción

La mayoría de los lenguajes de programación proporcionan el concepto de "alcance". El ámbito también determina la "visibilidad" y el "tiempo de vida" de un nombre definido en un ámbito. En C, C++ y Java, el alcance está determinado por la posición de las llaves.

Como variable definida en un alcance, solo se puede utilizar hasta que finalice el alcance.

En el ejemplo anterior, la sangría hace que el código Java sea más fácil de leer. Debido a que Java es un lenguaje de formato libre, los espacios adicionales, las tabulaciones y los retornos de carro no afectan el programa resultante. El compilador asumirá que la variable x ya está definida. Entonces C y C pueden "ocultar" una variable en un alcance mayor. Pero este enfoque no está permitido en Java.

Alcance de los objetos

Los objetos Java no tienen la misma vida útil que el tipo principal. Cuando se crea un objeto Java con la nueva palabra clave, queda fuera de alcance.

Los identificadores desaparecerán al final del alcance. Sin embargo, el objeto de cadena al que apunta S todavía ocupa espacio en la memoria. En el código anterior, no podemos acceder al objeto porque el único identificador que apunta a él está fuera de los límites del alcance. En los siguientes capítulos, continuará aprendiendo cómo pasar y copiar identificadores de objetos durante la ejecución del programa.

El resultado de esto es que el objeto creado con new se conservará durante el tiempo que queramos. Este problema de programación es particularmente grave en C y C++. Parece que el mayor problema se encuentra en C: como no se puede obtener ayuda del lenguaje, no se puede determinar si el objeto estará disponible cuando lo necesite. Es más, en C, una vez completado el trabajo, debes asegurarte de que el objeto esté limpio.

Esto plantea una pregunta interesante. Si Java deja los objetos sin cambios, ¿cómo puede evitar que inunden la memoria y eventualmente provoquen que el programa se "congele"? En C, este problema es el mayor dolor de cabeza para los programadores. Pero después de Java, la situación cambió. Java tiene un "recolector de basura" especial que encuentra todos los objetos creados con new e identifica a cuáles ya no se hace referencia. Luego libera automáticamente la memoria ocupada por esos objetos libres para que nuevos objetos puedan usarla. Esto significa que no tenemos que preocuparnos en absoluto por la recuperación de memoria. Simplemente cree objetos y déjelos automáticamente cuando ya no sean necesarios.

Al hacerlo, se evita un problema de programación común en C: el "desbordamiento de memoria" causado por el olvido del programador de liberar memoria.