Hemos intentado definir clases. Definir una clase es crear un nuevo tipo. Con la clase en su lugar, construimos objetos del tipo correspondiente. Además, cada tipo también debe tener una interfaz clara para que la utilicen los usuarios.
Podemos utilizar otros objetos en la definición de una nueva clase. Esta es la composición. La combinación es uno de los medios básicos para lograr la reutilización de programas en Java.
Combinación con "tiene-a"
Un objeto es un miembro de datos de otro objeto. Por ejemplo, veamos el ejemplo de la linterna recargable mencionado anteriormente:
La batería, la luz LED, el botón... de una linterna recargable pueden ser todos un objeto. Podemos definir una clase de Batería para definir y generar objetos de batería. En la definición de clase de la linterna recargable, se puede utilizar un objeto de batería como miembro de datos para representar el estado de la parte de la batería.
Definimos una clase de batería a continuación y usamos potencia para representar su potencia. Una batería se puede cargar (chargeBattery) y usar (useBattery). Usamos objetos de tipo Batería como miembros de datos en la siguiente definición de clase Antorcha:
Copie el código de código de la siguiente manera:
claseBatería
{
carga nula públicaBatería (doble p)
{
si (esta.potencia < 1.) {
esta.potencia = esta.potencia + p;
}
}
uso público booleanoBatería(doble p)
{
si (este.poder >= p) {
este.poder = este.poder - p;
devolver verdadero;
}
demás {
esta.potencia = 0.0;
devolver falso;
}
}
doble potencia privada = 0,0;
}
claseAntorcha
{
/**
* 10% de potencia por hora de uso
* advertencia cuando no hay energía
*/
activación de vacío público (int horas)
{
booleano utilizable;
utilizable = this.theBattery.useBattery( horas*0.1 );
si (utilizable! = verdadero) {
System.out.println("Ya no se puede utilizar, ¡debe cargarse!");
}
}
/**
* 20% de potencia por hora de carga
*/
cargo por anulación pública (int horas)
{
this.theBattery.chargeBattery( horas*0.2 );
}
/**
* composición
*/
Batería privada theBattery = batería nueva();
}
Lo nuevo anterior asigna memoria para el objeto Batería y es indispensable.
Definimos la clase Batería. La clase Torch utiliza un objeto de tipo Batería (theBattery) como miembro de datos. En el método de Torch, implementamos la funcionalidad proporcionada por la clase Battery manipulando la interfaz del objeto Battery.
Decimos que un objeto Antorcha tiene (tiene) un objeto Batería. La relación anterior se puede expresar como:
has-a: La linterna tiene una batería (tenga en cuenta la conexión en forma de diamante arriba)
Mediante combinación, podemos reutilizar el código relacionado con la batería. Si tenemos otras clases que usan Batería, como teléfonos móviles y calculadoras, podemos combinar objetos Batería en ellas. Esto elimina la necesidad de escribir funciones relacionadas separadas para cada clase.
Podemos agregar una clase de prueba para ver el efecto real:
Copie el código de código de la siguiente manera:
prueba de clase pública
{
principal vacío estático público (String [] argumentos)
{
Antorcha aAntorcha = nueva Antorcha();
System.out.println("Carga: 2 horas");
aAntorcha.carga(2);
System.out.println("Primer encendido: 3 horas");
una antorcha.encender(3);
System.out.println("Segundo encendido: 3 horas");
una antorcha.encender(3);
}
}
El resultado de ejecutar el programa anterior:
Carga: 2 horas
Primer encendido: 3 horas
Segundo encendido: 3 horas
¡No más utilizable, debe cargarse!
Usamos las funciones proporcionadas por el objeto de la batería mediante combinación, como detectar si la batería está agotada (según el valor de retorno de useBattery()).
tipo básico
Desde HelloWorld hasta orientado a objetos, llamamos tipos básicos int, float, double, boolean, etc. (tipos primitivos), que son clases especiales. Podemos entender un número entero como un objeto de tipo int. El tipo int puede tener interfaces de operación como asignación, suma y resta. Los tipos ordinarios pueden considerarse extensiones de tipos básicos. Hemos visto tipos primitivos como miembros de datos, parámetros de métodos, valores de retorno de métodos y variables automáticas dentro de métodos. En estos lugares también se pueden utilizar objetos de tipo natural y común, como los objetos de clase Batería y Antorcha.
En lenguaje C, los tipos de datos disponibles están (básicamente) preestablecidos, como int y float. En Java, además de utilizar estos tipos de datos preestablecidos, también podemos personalizar los tipos de datos que queramos a través de clases y luego usarlos mediante combinaciones. Pero existen diferencias entre los tipos básicos y los tipos ordinarios. Los tipos básicos se utilizan con frecuencia y ocupan una pequeña cantidad de espacio de memoria. Por lo tanto, en Java, en aras de la eficiencia, estos tipos básicos tienen métodos de administración de memoria diferentes a los de los tipos ordinarios (es decir, clases personalizadas). Por ejemplo, a los tipos básicos se les asignará espacio de memoria una vez declarados, mientras que los tipos ordinarios deben usar la nueva palabra clave para asignar espacio de memoria.
Java proporciona tipos comunes correspondientes para cada tipo básico. Por ejemplo, el tipo básico int corresponde al tipo Integer. Si un objeto de un tipo básico se convierte en una variable de tipo común correspondiente, el llamado tipo básico se convierte en un tipo en un sentido general (ya no hay diferencia en la gestión de la memoria).
De esta manera, tenemos una comprensión más profunda del concepto de Java de "todo es un objeto".
Resumir
combinación, tiene-a
tipo básico