Java: proceso de creación de objetos y inicialización
1. Tipos de datos en Java
Hay 3 tipos de datos en Java: tipos de datos básicos (en Java, booleano, byte, short, int, long, char, float y doble son tipos de datos básicos), tipo de referencia y tipo nulo. Entre ellos, el tipo de referencia incluye el tipo de clase (incluida la matriz) y el tipo de interfaz.
La siguiente declaración declara algunas variables:
int k; a a; // a es el nombre de la variable de objeto del tipo de datos A. B B1, B2, ..., B10000; // Suponga que B es una clase o interfaz abstracta. Cadena S;
Nota: Desde la perspectiva de los tipos de datos y las variables, las variables de tipo de datos básicas k, las variables de tipo de clase A y S, la clase abstracta o la variable de tipo de interfaz B (10,000), son todas las variables (identificadores).
2. Acerca de Many
Para distinguir entre identificadores variables de tipos de referencia e identificadores variables del tipo de datos básicos, utilizamos específicamente el mango para nombrar identificadores variables de tipos de referencia. En el ejemplo anterior, B1 a B10000, A y S son todos manejables. Manejar intuitivamente mira el mango y el mango. Utilizamos la traducción china de "mango" comúnmente utilizada en el mundo de las computadoras.
2.1 [En la programación de Windows] El significado de un mango es un entero único utilizado por Wondows para identificar objetos creados o utilizados por una aplicación. Windows utiliza varias manijas para identificar, como instancias de aplicación, Windows, controles, mapas de bits, objetos GDI, etc. El mango de Windows es un poco como un mango de archivo en el idioma C.
De la definición anterior, podemos ver que el mango es un identificador que se utiliza para identificar un objeto o proyecto. Es como nuestro nombre. Todos tendrán uno. Diferentes personas tienen diferentes nombres, pero también puede haber alguien con el mismo nombre que tú. Del tipo de datos, es solo un entero sin firmar de 16 bits. Una aplicación casi siempre obtiene un mango llamando a una función de Windows, que luego puede ser utilizada por otras funciones de Windows para hacer referencia al objeto correspondiente.
Si quieres saber las manijas más a fondo, puedo decirte que los mangos son consejos para consejos. Sabemos que el llamado puntero es una dirección de memoria. Una vez que se inicia la aplicación, los objetos que componen el programa residen en la memoria. Si simplemente lo entendemos, parece que mientras sepamos la primera dirección de esta memoria, podemos usar esta dirección para acceder al objeto en cualquier momento. Pero si realmente lo piensas, estás muy equivocado. Sabemos que Windows es un sistema operativo virtual basado en la memoria. En este entorno del sistema, Windows Memory Manager a menudo mueve objetos de un lado a otro en la memoria para satisfacer las necesidades de memoria de varias aplicaciones. Se mueve un objeto significa que su dirección ha cambiado. Si la dirección siempre cambia así, ¿dónde debemos encontrar el objeto?
Para resolver este problema, el sistema operativo Windows libera algunas direcciones de almacenamiento internos para que cada aplicación registre específicamente los cambios de dirección de cada objeto de aplicación en la memoria, y esta dirección (la ubicación de la unidad de almacenamiento) no cambia. Después de mover la ubicación del objeto en la memoria, el Administrador de memoria de Windows le dice a la nueva dirección del objeto para guardarla. De esta manera, solo necesitamos recordar esta dirección de mango para saber indirectamente dónde está el objeto en la memoria. El sistema asigna esta dirección cuando el objeto está cargado (carga) y se libera al sistema cuando el sistema está descargado.
Dirección de manejo (estable) → Registre la dirección del objeto en la memoria especialmente
2.2 El significado de las manijas en Java tiene una comprensión profunda del significado de las manijas [en la programación de Windows]. Podemos decir que el manejo es un término que necesitamos mucho al aprender Java. Su significado es distinguir el "objeto en sí" de las variables de objeto (o rigor: identificadores variables del tipo de datos al que pertenece el objeto).
2.3 Retorno a la declaración variable en 1:
Ahora, debe tener una visión clara de los comentarios a continuación.
int k, j; // k almacena un número entero. A a; // La dirección se almacena en a. B B1, B2, ..., B10000; // B1, ..., B10000 almacena la dirección en el interior. Cadena S; // s almacena la dirección.
3. Acerca de la referencia
¿Qué es una "cita"? "El identificador que manipulas es en realidad una 'referencia' a un objeto". (Pensando en Java 2e)
La traducción es: el identificador que manipulas es en realidad una "referencia" a un objeto. O para ser más precisos, traducido al: el identificador que opera es en realidad una "referencia" a un objeto. Obviamente, la referencia en el texto original es algo con un sentido de dirección.
Regrese a Java y consulte el número de identificación del objeto, la ID del objeto o el número de teléfono móvil del objeto. Por supuesto, más del dicho es que la referencia es el número de habitación donde el objeto vive en la memoria. ¡Hablando intuitivamente, la referencia a un objeto es el valor de retorno al crear un objeto! Una referencia es el valor de retorno de una nueva expresión.
nuevo A (); Aquí hay un objeto, pero no usamos un mango para sostener (mantener, mantener, guardar) la referencia. Desde una perspectiva microscópica, la nueva expresión completa la tarea de inicialización de objetos (tres pasos, análisis detallado a continuación), y en general, devuelve una referencia.
Vuelve a la declaración variable en 1 nuevamente y eche un vistazo a los comentarios a continuación.
A a; // Declarar el manejo A, pero no se inicializa, por lo que el valor en el interior es nulo. B B1, B2, ..., B10000; // Declarar manijas B1, ..., B10000, pero no se inicializan, por lo que el valor en el interior es nulo. Cadena S; // Declarar manejo S, pero no se inicializa, por lo que el valor en el interior es nulo.
4. La relación entre el mango y la referencia
A a; // declarar el mango A, el valor es nulla = nuevo a (); // Inicialización del identificador (Handle = Reference; es decir, asigne la referencia al identificador)
Cita: el valor de nuevo A (). Las referencias se pueden considerar simplemente como la dirección donde el objeto ocupa el espacio de memoria; A través de referencias a objetos, pueden distinguirse convenientemente de otros objetos, y las referencias son la identidad única del objeto.
Después de inicializar el mango, puede usar el mango para controlar de forma remota el objeto.
Por supuesto, esto es solo para explicar la creación e inicialización de objetos de un aspecto. Después de comprender la relación entre manijas y referencias, todo el proceso de inicialización de objetos se analiza a continuación. Primero hagamos los siguientes preparativos, hable sobre Stack y Stack.
5. Pila y montón en Java
En Java, la memoria se divide en dos tipos: "pila" y "montón" (pila y montón). El tipo de datos básicos se almacena en la "pila", y el tipo de referencia de objeto en realidad se almacena en el "montón", y el valor de dirección de la memoria de referencia solo se conserva en la pila.
Por cierto, hablemos sobre los métodos "==" y "igual ()" para ayudar a comprender el concepto de ambos (pila y montón).
Al comparar variables con "==" en Java, el sistema usa el valor almacenado en la variable en la pila como base para la comparación. El valor almacenado en el tipo de datos básicos en la pila es su valor de contención, y el valor almacenado en el tipo de referencia en la pila es el valor de dirección del propio objeto. La clase de objeto en el paquete Java.lang tiene el método público booleano igual (obj obj). Compara si dos objetos son iguales. El método igual () del objeto devuelve verdadero solo si las dos referencias que se comparan apuntan al mismo objeto (los manijas son iguales). (En cuanto al método igual () de la clase de cadena, anula el método igual () y no se discute en este artículo).
6. Proceso de creación de objetos e inicialización
En Java, el objeto es una instancia de la clase. En general, cuando una instancia de una clase, todos los miembros de dicha clase, incluidas las variables y los métodos, se copian en una nueva instancia de este tipo de datos. Analice los siguientes dos códigos.
6.1 Vehicle Veh1 = nuevo vehículo ();
La declaración anterior hace lo siguiente:
① El "nuevo vehículo" a la derecha utiliza la clase del vehículo como plantilla para crear un objeto de clase de vehículo (también conocido como objeto de vehículo) en el espacio de montón.
② El extremo de () significa que después de que se crea el objeto, el constructor de la clase de vehículo se llama inmediatamente para inicializar el objeto recién generado. Debe haber un constructor. Si no se crea, Java agregará un constructor predeterminado.
③El "Vehicle Veh1" a la izquierda crea una variable de referencia de clase de vehículo.
④ El operador "=" hace el punto de referencia del objeto al objeto del vehículo que acaba de crear. (Recuerde manijas y referencias)
Divida la declaración anterior en dos pasos:
Vehicle Veh1; Veh1 = nuevo vehículo ();
Es más claro escribir de esta manera. Hay dos entidades: una es la variable de referencia del objeto, y la otra es el objeto en sí. Las entidades creadas en el espacio Heap son diferentes de las creadas en el espacio de la pila. Aunque son entidades que existen, parece difícil "atraparlo" con precisión. Estudiemos la segunda oración cuidadosamente y descubramos cuál es el nombre del objeto que acaba de crear. Algunas personas dicen que se llama "vehículo". No, "vehículo" es el nombre de la clase (la plantilla de creación para el objeto). Una clase de vehículos puede crear innumerables objetos basados en esto, y estos objetos no pueden llamarse "vehículo". El objeto ni siquiera tiene un nombre, por lo que no se puede acceder directamente. Solo podemos acceder a objetos indirectamente a través de referencias de objetos.
6.2 Vehicle Veh2;
Veh2 = Veh1;
Dado que Veh1 y Veh2 son solo referencias a objetos, lo que hace la segunda línea es simplemente asignar la referencia (dirección) de Veh1 a Veh2, de modo que Veh1 y Veh2 apuntan al objeto de vehículo único al mismo tiempo.
6.3 Veh2 = nuevo vehículo ();
La variable de referencia Veh2 apunta al segundo objeto en su lugar.
Deducido de la declaración anterior, podemos sacar la siguiente conclusión: ① Una referencia de objeto puede apuntar a 0 o 1 objeto; ② Un objeto puede tener n referencias para señalarlo.
Java: conversión de tipo de datos
1. Tipos simples de Java y sus clases de encapsuladores
1.1 Java Tipos simples y clases de encapsulación Sabemos que Java Language es un lenguaje de programación orientado a objetos típico, pero teniendo en cuenta las ventajas de que algunos tipos de datos básicos son simples en estructura, memoria pequeña y velocidad de acceso rápido, Java todavía proporciona soporte para estos tipos de datos simples no orientados a objetos. Por supuesto, cuando Java proporciona una gran cantidad de otras clases, también proporciona clases encapsuladas correspondientes a tipos de datos simples. Por lo tanto, Java tiene diferentes tipos de datos como INT y entero (flotante y flotante, doble y doble ...).
Hay dos categorías principales de tipos de datos en el lenguaje Java: uno es un tipo simple, también conocido como el tipo principal (primitivo), y el otro es un tipo de referencia (referencia). Una variable de tipo simple almacena un valor específico, mientras que una variable de tipo de referencia almacena una referencia a un objeto.
Java determina el tamaño de cada tipo simple. Estos tamaños no cambian con los cambios en la estructura de la máquina. Este tamaño es invariante, que es una de las razones por las cuales los programas Java tienen una fuerte portabilidad.
La siguiente tabla enumera los tipos simples, la ocupación de los bits binarios y las clases de encapsuladores correspondientes definidas en Java.
Tipos simples en la tabla Java
1.2 Por qué usar clases de encapsulación. Tome int y entero como ejemplo. Aunque esencialmente representan un entero de 32 bits, son diferentes tipos de datos. De hecho, los enteros utilizados directamente en Java son int (en lo que respecta a Int y se preocupan por entero). Solo cuando los datos deben aparecer como la identidad de un objeto, el valor entero debe encapsularse en un objeto con el encapsulador entege, el int.
Por ejemplo: para agregar un entero al vector en el paquete java.util, el valor entero debe encapsularse en una instancia entera de la siguiente manera:
Vector v = nuevo vector (); int k = 121; v.addelemt (nuevo entero (k));
Además, Integer, como la clase de encapsulador correspondiente a INT, proporciona muchos métodos, como métodos de construcción de enteros, métodos de conversión de enteros a otros tipos numéricos, etc., que no están disponibles en datos de tipo int.
2. Constantes en Java
Necesitamos prestar atención a los siguientes tipos de constantes.
2.1 Cuando las constantes enteras hexadecimales se expresan en hexadecimal, deben comenzar con 0x o 0x, como 0xff, 0x9a.
2.2 El entero octal constante Octal debe comenzar con 0, como 0123, 034.
2.3 de tipo largo de tipo largo debe terminar con L, como 9L, 342L.
2.4 Constantes de flotación Dado que el tipo predeterminado de la constante decimal es de tipo doble, F (f) debe agregarse después del tipo de flotación. Las variables con decimales también son de tipo doble de forma predeterminada.
flotante f;
f = 1.3f; // f debe ser declarado.
2.5 constantes de caracteres Las constantes de caracteres deben estar encerradas en dos citas individuales (tenga en cuenta que las constantes de cadena están encerradas en dos cotizaciones dobles). Los personajes en Java representan dos bytes.
Algunos personajes de escape de uso común.
①/R significa aceptar la entrada del teclado, que es equivalente a presionar la tecla ENTER;
②/N significa una nueva línea;
③/t representa un carácter de pestaña, que es equivalente a la tecla de tabla;
④/B representa la tecla Backspace, que es equivalente a la tecla de espacio posterior;
⑤/'significa citas individuales;
⑥/'' significa cotizaciones dobles;
⑦ // significa una barra/.
3. Conversión entre tipos de datos simples
Hay dos formas de convertir entre tipos simples de datos: conversión automática y conversión de fundición, que generalmente ocurre cuando se pasan los parámetros de la expresión o método.
3.1 Conversión automática específicamente, cuando se calculan los datos "pequeños" junto con los datos "grandes", el sistema convertirá automáticamente los datos "pequeños" en datos "grandes" y luego realizará el cálculo. Al llamar al método, los parámetros reales son "pequeños" y los datos de parámetros formales del método llamado son "grandes" (si hay una coincidencia, por supuesto, el método de coincidencia se llamará directamente), el sistema convertirá automáticamente los "datos" pequeños "" grandes "y luego llamará al método. Naturalmente, para múltiples métodos sobrecargados del mismo nombre, se convertirá en los datos "cercanos" "grandes" y se llamará.
Estos tipos de "pequeños" a "grandes" son (byte, breve, char)-int-long-float-double. De lo que estamos hablando aquí no se refiere al número de bytes ocupados, sino al tamaño del rango que representa el valor.
Consulte el siguiente ejemplo:
① Las siguientes declaraciones se pueden pasar directamente en Java:
byte b; int i = b; long l = b; flotante F = b; doble d = b;
② Si el tipo de nivel de bajo nivel es de tipo char, se convertirá en el valor del código ASCII correspondiente al convertirse en un tipo de alto nivel (tipo integral), por ejemplo
char c = 'c'; int i = c; System.out.println ("Output:"+i);
Producción:
Salida: 99;
③ Para los tres tipos de byte, corto y char, son horizontales, por lo que no pueden convertirse automáticamente entre sí. Se puede usar la siguiente conversión de tipo de reparto.
corto i = 99; char c = (char) i; system.out.println ("salida:"+c);Producción:
Salida: C;
Si hay un método en el polimorfismo de objetos:
f (byte x) {...}; f (corto x) {...}; f (int x) {...}; f (largo x) {...}; f (float x) {...}; f (doble x) {...}; f (doble x) {}; También hay: char y = 'a'; Entonces, ¿a qué método llamará la declaración f (y)? La respuesta es: F (int x) {...}, porque su parámetro de referencia formal es "grande" y es el "más cercano".
Y para el método:
f (float x) {...}; f (doble x) {...}; También hay: largo y = 123L; Luego, el método llamado por la declaración f (y) es f (flotante x) {...}.
3.2 Casting Al convertir datos "grandes" en datos "pequeños", puede usar la fundición. Es decir, debe usar el siguiente formato de declaración:
int n = (int) 3.14159/2;
Como puede imaginar, esta conversión ciertamente puede conducir a desbordamiento o una disminución de la precisión.
3.3 Mejora automáticamente el tipo de expresión de datos. Con respecto a la mejora automática del tipo, preste atención a las siguientes reglas.
① Todos los valores de los tipos de byte, cortos y char se promovirán a Tipo int;
Si hay un operando que es largo, el resultado del cálculo es largo;
Si hay un operando que es tipo flotante, el resultado del cálculo es el tipo de flotación;
Si hay un operando que es de doble tipo, el resultado del cálculo es de tipo doble;
ejemplo,
byte b; b = 3; b = (byte) (b*3); // El byte debe ser declarado.
3.4 Conversión de tipo de transición para la clase de embalaje en términos generales, primero declaramos una variable y luego generamos una clase de empaque correspondiente, y podemos usar varios métodos de la clase de embalaje para realizar la conversión de tipo. Por ejemplo:
① Cuando desee convertir el flotador en doble tipo:
flotante F1 = 100.00f; Flotante F1 = nuevo flotador (F1); Double d1 = f1.DoubleValue (); // f1.DoubleValue () es el método para devolver el tipo de valor doble de la clase Float
② Cuando desea convertir el tipo doble en un tipo int:
doble d1 = 100.00; doble d1 = nuevo doble (d1); int i1 = d1.intvalue ();
Convierta variables de tipos simples a la clase de envoltorio correspondiente, y se puede utilizar el constructor de la clase de envoltorio. Es decir: booleano (valor booleano), carácter (valor de char), entero (valor int), largo (valor largo), flotante (valor flotante), doble (valor doble)
En cada clase de envasado, siempre hay un método de × × valor () para obtener sus datos de tipo simples correspondientes. Usando este método, la conversión entre diferentes variables numéricas también se puede realizar. Por ejemplo, para una clase de tipo real de doble precisión, intValue () puede obtener su variable entera correspondiente, y DoubleValue () puede obtener su variable de tipo real de doble precisión de doble precisión correspondiente.
4. Conversión entre cuerdas y otros tipos
4.1 Conversión de otros tipos a cadenas ① Llame al método de conversión de cadena de la clase: X.ToString ();
② Conversión automática: x+";
③ Métodos utilizando String: String.VolueOf (x);
4.2 Convierta la cadena a otros tipos como valores ① Primero conviértelo en la instancia de envoltorio correspondiente, y luego llame al método correspondiente para convertirlo a otros tipos. Por ejemplo, el formato de convertir el valor de tipo doble del "32.1" en el personaje es: nuevo flotador ("32.1"). DoubleValue (). También puede usar: Double.ValueOf ("32.1"). DoubleValue ()
② Método estático parsexxx
Cadena s = "1"; byte b = byte.parsebyte (s); short t = short.parseshort (s); int i = integer.parseInt (s); long l = long.parselong (s); float f = float.parsefloat (s); doble d = doble.parsedubo (s);
③ El método GetNumericValue (Charch) del personaje se puede encontrar en la API.
5. Conversión de la clase de fecha y otros tipos de datos
No existe una correspondencia directa entre enteros y clases de fecha, pero puede usar el tipo int para representar año, mes, día, hora, minuto y segundos respectivamente, de modo que se establece una correspondencia entre los dos. Al realizar esta conversión, puede usar tres formas del constructor de clases de fecha:
① Date (int Year, int mes, int Fate): int type representa el año, mes y día ② Date (intane, int mes, int fechle, int hrs, int min): int type representa el año, mes, día, hora y minuto ③ -date (el año intan, el mes, int hrs, int min, int): int type representa el año, mes, día, hora, minuto, minuto, y segundo allí es una duración de la duración de la duración, un tiempo interesante es un tiempo interesante, una duración de la duración de la duración de la duración y la fecha de la duración de la duración y la fecha de la duración interesante, una duración de la duración de la duración y la fecha de intermediación de la duración de la duración y la fecha intermedia entre sí, un largo. Las clases, es decir, un momento se expresa como el número de milisegundos a partir de las 0:00:00, GMT el 1 de enero de 1970. Para esta correspondencia, la clase de fecha también tiene su constructor correspondiente: fecha (fecha larga).
Obtenga el año, mes, día, hora, minuto, segundo y semana en la clase de fecha. Puede usar getyear (), getMonth (), getDate (), gethours (), getMinutes (), getSeconds (), getday (), y también puede entenderlo como convertir la clase de fecha en un int.
El método getTime () de la clase de fecha puede obtener el número entero largo correspondiente al tiempo que mencionamos anteriormente. Al igual que la clase de envoltura, la clase de fecha también tiene un método toString () que puede convertirlo en la clase de cadena.
A veces queremos obtener un formato específico de fecha, por ejemplo 20020324, podemos usar el siguiente método, primero presentarlo al comienzo del archivo,
import java.text.simpledateFormat; import java.util.*; java.util.date date = new java.util.date (); // Si desea obtener el formato de YYYYMMDD SimpleDateFormat sy1 = new SimpleDateFormat ("yyyymmdd"); string dateFormat = sy1.format (date); // Si desea obtener año, mes, día, SimpleDateFormat sy = new SimpleDateFormat ("yyyyyy"); SimpleDateFormat SM = new SimpleDateFormat ("mm"); SimpleDateFormat sd = new SimpleDateFormat ("dd"); string syear = sy.format (date); string smon = sm.format (date); string sday = sd.format (date);