[Tecnología Java Core] Programación orientada a objetos

inserte la descripción de la imagen aquí

Programación orientada a objetos

1. Orientado a procesos y orientado a objetos

Orientado a procesos (POP) vs. Orientado a objetos (OOP)

  • Ambos son un tipo de pensamiento, y la orientación a objetos es relativa a la orientación a procesos. Orientado a procesos, enfatizando el comportamiento funcional, tomando la función como la unidad más pequeña y considerando cómo hacerlo. Orientado a objetos, encapsula funciones en objetos, enfatiza objetos con funciones, toma clase/objeto como la unidad más pequeña y considera quién lo hará.
  • Orientado a objetos enfatiza el uso de métodos y principios de pensamiento utilizados por humanos en la lógica del pensamiento diario, como abstracción, clasificación, herencia, agregación, polimorfismo, etc.

Tres características de la orientación a objetos

  • encapsulación
  • Herencia
  • polimorfismo

Una visión general del pensamiento orientado a objetos

  • Los programadores se transforman de ejecutores orientados a procesos a conductores orientados a objetos
  • La idea y los pasos del método de análisis orientado a objetos para analizar el problema:
    • Según las necesidades del problema, seleccione la entidad del mundo real de la que trata el problema .
    • A partir de las entidades se encuentran las propiedades y funciones relacionadas con la solución del problema, y ​​estas propiedades y funciones forman las clases en el mundo conceptual .
    • Las entidades abstractas se describen en lenguaje informático para formar la definición de clases en el mundo informático . Es decir, con la ayuda de cierto lenguaje de programación, la clase se construye en una estructura de datos que la computadora puede reconocer y procesar.
    • Crear instancias de clases como objetos en el mundo de la informática . Los objetos son la herramienta definitiva para la resolución de problemas en el mundo de la informática.

2. Elementos básicos del lenguaje Java: clases y objetos

clases y objetos

  • Clase (Class) y object (Object) son los conceptos centrales de la orientación a objetos.
    • Una clase es una descripción de una clase de cosas, una definición conceptual abstracta .
    • Un objeto es cada individuo de este tipo de cosa que realmente existe , por lo que también se le llama instancia .

El uso de clases y objetos (implementación del pensamiento orientado a objetos)

  • Crear una clase, diseñar los miembros de la clase.
  • crear objeto de clase
  • Llamar a la estructura de un objeto a través de "objeto.propiedad" o "objeto.método"

Si se crean varios objetos de una clase, cada objeto tiene su propio conjunto de propiedades (no estáticas) de la clase. Es decir: si modificamos la propiedad a de un objeto, no afectará el valor de la propiedad a de otro objeto.

Creación y uso de objetos: análisis de memoria

  • Montón (Heap) , el único propósito de esta área de memoria es almacenar instancias de objetos , y casi todas las instancias de objetos asignan memoria aquí. Esto se describe en la Especificación de la máquina virtual de Java: Todas las instancias de objetos y matrices deben asignarse en el montón.
  • La llamada pila (Stack) se refiere a la pila de la máquina virtual. La pila de la máquina virtual se utiliza para almacenar variables locales , etc. La tabla de variables locales almacena varios tipos de datos básicos (boolean, byte, char, short, int, float, long, double) y referencias de objetos (tipo de referencia, que no es lo mismo que el objeto en sí, es el objeto en el montón La primera dirección de la memoria). Después de ejecutar el método, se libera automáticamente.
  • Área de método , que se utiliza para almacenar datos como información de clase, constantes, variables estáticas, código compilado por el compilador instantáneo, etc. que ha cargado la máquina virtual

3. Uno de los miembros de la clase: atributo

Propiedades (variables miembro) frente a variables locales

  • Mismo punto
    • El formato de definición de variables: tipo de datos nombre de variable = valor de variable
    • Declarar primero, usar después
    • Las variables tienen su alcance correspondiente
  • diferencia
    • Donde se declara en la clase es diferente. Los atributos se definen directamente en un par de {} en la clase; las variables locales se declaran en métodos, parámetros de métodos, bloques de código, parámetros de constructores y variables dentro de constructores
    • En cuanto a la diferencia en los modificadores de permisos. Los atributos pueden indicar sus permisos al declarar atributos, utilizando modificadores de permisos. Modificadores de permisos comunes: privado, público, predeterminado, protegido. Las variables locales no pueden usar modificadores de permisos.
    • El caso de los valores de inicialización por defecto
      • Atributo: El atributo de la clase, según su tipo, tiene un valor de inicialización por defecto. Entero (byte, corto, int, largo): 0; Flotante (flotante, doble): 0.0; Carácter (char): 0 (o '\u0000'); Booleano (booleano): falso; tipo de datos de referencia (clase, matriz , interfaz): nulo
      • Variables locales: sin valor inicial predeterminado. Significa que debemos asignar explícitamente un valor antes de llamar a una variable local. En particular, cuando se llaman los parámetros formales, podemos asignar valores.
    • Ubicación de carga en la memoria: los atributos se cargan en el espacio de almacenamiento dinámico (no estático); las variables locales se cargan en el espacio de almacenamiento

4. El segundo miembro de la clase: método

declaración de método

权限修饰符 返回值类型 方法名(形参列表){
  方法体
}
// 注意:static、final、abstract来修饰的方法,后面再讲

Tipo de valor de retorno: con valor de retorno VS sin valor de retorno

  • Si el método tiene un valor devuelto, el tipo de valor devuelto debe especificarse cuando se declara el método. Al mismo tiempo, en el método, debe usar la palabra clave return para devolver una variable o constante del tipo especificado: "return data".
  • Si el método no devuelve un valor, se utiliza void cuando se declara el método. Por lo general, no necesita usar return en un método que no devuelve un valor. Sin embargo, si se usa, solo "return;" significa el final de este método.

Uso de la palabra clave return

  • Ámbito de uso: utilizado en el cuerpo del método
  • Función: 1. Terminar el método 2. Para los métodos con tipos de valores devueltos, use el método "devolver datos" para devolver los datos deseados.
  • Nota: La declaración de ejecución no se puede declarar después de la palabra clave de retorno.

uso del método

  • En el uso del método, puede llamar a las propiedades o métodos de la clase actual. En particular, el método A se llama en el método A: método recursivo
  • Los métodos no se pueden definir dentro de los métodos.

Entender "todo es un objeto"

  • En la categoría del lenguaje Java, todos encapsulamos funciones y estructuras en clases, y llamamos a interfaces funcionales específicas a través de la instanciación de clases.
    • Escáner, cadena
    • Archivo: Archivo
    • Recurso web: URL
  • Cuando se trata de la interacción entre Java y el front-end Html y la base de datos de back-end, las estructuras de front-end y back-end se reflejan en clases y objetos cuando interactúan en el nivel de Java.

Método de sobrecarga (sobrecarga)

  • El concepto de sobrecarga: En una misma clase, se permite más de un método con el mismo nombre, siempre que su número de parámetros o tipos de parámetros sea diferente.
  • Las características de la sobrecarga: no tiene nada que ver con el tipo de valor de retorno, solo mire la lista de parámetros, y la lista de parámetros debe ser diferente (número de parámetro o tipo de parámetro). Al llamar, se distingue según la lista de parámetros del método.
// 返回两个整数的和
int add(int x, int y) {return x+y;}
// 返回三个整数的和
int add(int x, int y, int z) {return x+y+z;}
// 返回两个小数的和
double add(double x, double y) {return x+y;}

número variable de parámetros formales

JavaSE 5.0 proporciona el mecanismo Varargs (número variable de argumentos), que permite la definición directa de parámetros formales que pueden coincidir con múltiples parámetros reales. Por lo tanto, es posible pasar un número variable de parámetros reales de una forma más sencilla.

// JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型的变量
public static void test(int a, String[] books);
// JDK 5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a, String...books);
  • Formato de la declaración: nombre del método (nombre del tipo de parámetro...nombre del parámetro)
  • Parámetros variables: el número de parámetros del tipo especificado en la parte del parámetro del método es variable: 0, 1 o más
  • Un método con un número variable de parámetros formales y un método con el mismo nombre se sobrecargan mutuamente.
  • El uso de métodos de parámetros variables es coherente con el uso de matrices en la sección de parámetros de métodos
  • Hay parámetros variables en la parte de parámetros del método, que deben colocarse al final de la declaración de parámetros formales.
  • En la posición de parámetro formal de un método, se puede declarar como máximo un número variable de parámetros formales
public static void main(String[] args) {
  DemoTest test = new DemoTest();
  test.show(12); // show(int i)
  test.show("hello"); // show(String s)
  test.show("hello","hello"); // show(String ... s)
  test.show(); // show(String ... s)
  test.show(new String[] {"AA", "BB", "CC"}); // show(String ... s)
}

public void show(int i) {
  System.out.println("show(int i)");
}

public void show(String s) {
  System.out.println("show(String s)");
}

public void show(String ... s) {
  System.out.println("show(String ... s)");
}

Mecanismo de paso de valor de parámetro de método

¿Cómo pasar el valor del parámetro real de Java al método?

  • Solo hay una forma de pasar parámetros a métodos en Java: pasar por valor. Es decir, se pasa una copia (réplica) del valor del parámetro real al método, mientras que el parámetro en sí no se ve afectado.
    • El parámetro formal es un tipo de datos básico: el "valor de datos" de la variable del tipo de datos básico del parámetro real se pasa al parámetro formal
    • El parámetro formal es un tipo de datos de referencia: pase el "valor de dirección" de la variable de tipo de datos de referencia del parámetro real al parámetro formal
int[] arr = new int[] {1,2,3};
System.out.println(arr); //地址值
char[] arr1 = new char[] {'a', 'b', 'c'};
// println()方法被重载,所以输出的不是地址值
System.out.println(arr1); //abc

5. Una de las características orientadas a objetos: encapsulación

Cuatro modificadores de acceso

  • Los modificadores de permisos de Java public, protected y private se colocan antes de la definición de miembro de la clase para limitar los derechos de acceso del objeto al miembro de la clase.
modificador dentro de la clase mismo paquete Subclases de diferentes paquetes. mismo proyecto
privado
(por defecto)
protegido
público

Solo public y default (predeterminado) se pueden usar para la modificación de permisos de clase.

  • Se puede acceder a las clases públicas desde cualquier lugar.
  • Solo las clases dentro del mismo paquete pueden acceder a la clase predeterminada.

¿Qué es la encapsulación?

  • Oculte la complejidad interna del objeto y solo exponga una interfaz simple al mundo exterior. Es conveniente para llamadas externas, mejorando así la escalabilidad y mantenibilidad del sistema. En términos sencillos, ocultar lo que debería ocultarse y exponer lo que debería exponerse. Esta es la idea de diseño de la encapsulación.

La encarnación de la encapsulación.

  • Los cuatro permisos especificados por Java (ordenados de menor a mayor): privado, predeterminado, protegido, público
  • 4 tipos de permisos pueden modificar la clase y su estructura interna: atributos, métodos, constructores, clases internas
  • Específicamente, los 4 permisos se pueden usar para modificar la estructura interna de la clase: atributos, métodos, constructores y clases internas; si se modifica la clase, solo se puede usar: predeterminado, público

Resumen: Java proporciona 4 modificadores de permisos para modificar la estructura interna de la clase y la clase, lo que refleja la visibilidad de la clase y la estructura interna de la clase cuando se llama

6. El tercer miembro de la clase: el constructor

El papel del constructor.

  • Crear objeto
  • Inicializar la información del objeto

ilustrar

  • Si no hay un constructor que defina la clase que se muestra, el sistema proporcionará un constructor con parámetros vacíos de forma predeterminada y el modificador de permisos del constructor predeterminado es coherente con el modificador de clase.
  • Defina el formato del constructor: nombre de la clase del modificador de permisos (lista de parámetros formales) {}
  • Múltiples constructores definidos en una clase constituyen una sobrecarga entre sí
  • Una vez que definimos explícitamente el constructor de la clase, el sistema ya no proporciona un constructor de parámetros vacío predeterminado.
  • En una clase, debe haber al menos un constructor.

El proceso de asignación de atributos.

  • inicialización predeterminada
  • inicialización explícita
  • inicialización en el constructor
  • Asignación por "objeto.propiedad" u "objeto.método"

7. Ampliar el conocimiento

JavaBean

  • JavaBean es un componente reutilizable escrito en lenguaje Java.
  • El llamado JavaBean se refiere a una clase Java que cumple con los siguientes estándares:
    • la clase es publica
    • tiene un constructor público sin argumentos
    • Hay atributos, y hay métodos get y set correspondientes

diagrama de clases UML

  • +Representa el tipo público, -representa el tipo privado, #representa el tipo protegido
  • Escritura de método: tipo de método (+, -) nombre de método (nombre de parámetro: tipo de parámetro): tipo de valor de retorno
  • Atributo: :el primero es el nombre del atributo :y el segundo es el tipo del atributo.

8. Palabra clave: este

  • esto se puede usar para modificar y llamar: propiedades, métodos, constructores
  • Cuando esto modifica propiedades y métodos, puede entenderse como: el objeto actual o el objeto que se está creando actualmente
    • En el método de la clase, podemos usar "this.property" o "this.method" para llamar a la propiedad o método del objeto actual. Pero por lo general, elegimos omitir "esto". En casos especiales, si el parámetro formal del método tiene el mismo nombre que el atributo de la clase, debemos usar explícitamente el método "esta. variable" para indicar que la variable es un atributo, no un parámetro formal.
    • En el constructor de la clase, podemos usar "this.property" o "this.method" para llamar a la propiedad del objeto o al método que se está creando actualmente, pero generalmente elegimos omitir "this". En casos especiales, si el parámetro formal del constructor tiene el mismo nombre que el atributo de la clase, debemos usar explícitamente el método "this.variable" para indicar que la variable es un atributo en lugar de un parámetro formal.
  • esto llama al constructor
    • En el constructor de la clase, podemos usar explícitamente el método "this (lista de parámetros)" para llamar a otros constructores especificados en esta clase
    • El constructor no puede llamarse a sí mismo a través de "esta (lista de parámetros)"
    • Si hay n constructores en una clase, como máximo n-1 constructores usan "esta (lista de parámetros)"
    • Se estipula que "esta (lista de parámetros)" debe declararse en la primera línea del constructor actual, por lo que dentro del constructor, como máximo se puede declarar una "esta (lista de parámetros)" para llamar a otros constructores.

9. Palabra clave: paquete

  • Para realizar mejor la gestión de clases en el proyecto, se proporciona el concepto de paquete.
  • Use paquete para declarar el paquete al que pertenece la clase o interfaz, y declárelo en la primera línea del archivo fuente
  • Los paquetes, pertenecientes a identificadores, siguen las reglas de nomenclatura de identificadores, especificaciones (xxxyyyzzz), "ver el nombre y conocer el significado"
  • Cada vez que "." significa una capa de directorio de archivos

Suplemento: Bajo el mismo paquete, no se pueden nombrar interfaces y clases con el mismo nombre; bajo diferentes paquetes, se pueden nombrar interfaces y clases con el mismo nombre.

10. Palabra clave: importar

  • Importe la clase o interfaz bajo el paquete especificado utilizando la pantalla de importación en el archivo fuente
  • declarado entre la declaración del paquete y la declaración de la clase
  • Si necesita importar varias clases o interfaces, puede especificar explícitamente varias declaraciones de importación en paralelo
  • Ejemplo: puede usar java.util.* para importar todas las clases o interfaces bajo el paquete util al mismo tiempo
  • Si la clase o interfaz importada está bajo el paquete java.lang, o bajo el paquete actual, esta declaración de importación puede omitirse
  • Si usa una clase con el mismo nombre en un paquete diferente en su código. Luego, debe usar el nombre de clase completo de la clase para indicar a qué clase se llama
  • Si se ha importado la clase del paquete java.a. Luego, si necesita usar las clases en los subpaquetes del paquete a, aún necesita importarlos.
  • El uso de la combinación estática de importación: llame a la propiedad o método estático bajo la clase o interfaz especificada

11. La segunda característica orientada a objetos: herencia

Beneficios Heredados

  • Redundancia de código reducida y reutilización de código mejorada
  • Funciones fáciles de expandir
  • Proporciona un requisito previo para el uso de polimorfismo en el futuro.

Descripción de la sucesión

  • Formato de herencia: la clase A extiende B{}
  • Realización: Una vez que la subclase A hereda la clase padre B, la subclase A obtiene todas las propiedades y métodos declarados en la clase padre B. En particular, para las propiedades o métodos declarados como privados en la clase principal, después de que la subclase hereda la clase principal, todavía piensa que ha adquirido la estructura privada en la clase principal. Es solo por el impacto de la encapsulación que la subclase no puede llamar directamente a la estructura de la clase principal.
  • Después de que la subclase herede la clase principal, también puede declarar sus propias propiedades o métodos únicos: para realizar la expansión de funciones

Reglas sobre herencia en Java

  • Una clase puede ser heredada por varias subclases
  • Herencia única de clases en Java: una clase solo puede tener una clase principal
  • La clase padre hijo es un concepto relativo.
  • La clase principal heredada directamente por la clase secundaria se denomina clase principal directa; la clase principal heredada indirectamente se denomina clase principal indirecta
  • Una vez que la subclase hereda la clase principal, obtiene las propiedades y los métodos declarados en la clase principal directa y en todas las clases secundarias indirectas.

Nota complementaria

  • Si no declaramos explícitamente la clase principal de una clase, esta clase hereda de la clase java.lang.Object
  • Todas las clases java (excepto la clase java.lang.Object) se heredan directa o indirectamente de la clase java.lang.Object
  • Significa que todas las clases de Java tienen las funciones declaradas por la clase java.lang.Object.

Reescritura de métodos (anular/sobrescribir)

  • Anular: después de que la subclase herede la clase principal, puede anular el método con el mismo nombre y los mismos parámetros en la clase principal
  • Aplicación: después de reescribir, cuando se crea un objeto de subclase y se llama a un método con el mismo nombre y parámetros en la subclase a través del objeto de subclase, lo que realmente se ejecuta es que la subclase reescribe el método de la clase principal
  • regulaciones anuladas
    • El nombre del método y la lista de parámetros formales del método anulado por la subclase son los mismos que el nombre del método y la lista de parámetros formales del método anulado de la clase principal.
    • El modificador de permiso del método anulado por la subclase no es menor que el modificador de permiso del método anulado de la clase principal
      • Caso especial: las subclases no pueden anular los métodos declarados como permisos privados en la clase principal
    • Tipo de valor de retorno:
      • El tipo de valor de retorno del método anulado de la clase principal es nulo, y el tipo de valor de retorno del método anulado por la subclase solo puede ser nulo
      • El tipo de valor de retorno del método anulado de la clase principal es un tipo, y el tipo de valor de retorno del método anulado por la subclase puede ser una clase A o una subclase de una clase
      • Si el tipo de valor devuelto del método invalidado de la clase principal es un tipo de datos básico (por ejemplo: doble), el tipo de valor devuelto del método invalidado por la subclase debe ser el mismo.
    • El tipo de excepción lanzado por el método anulado de la subclase no es mayor que el tipo de excepción lanzado por el método anulado de la clase principal
    • Los métodos con el mismo nombre y parámetros en la subclase y la clase principal se declaran como no estáticos (considere reescribir), o ambos se declaran como estáticos (no reescribiendo).

12. Palabra clave: súper

  • super se puede usar para llamar: propiedades, métodos, constructores
  • uso de súper
    • Podemos estar en un método o constructor de una subclase. Al usar "super. propiedad" o "super. método", invoque explícitamente la propiedad o el método declarado en la clase principal. Sin embargo, en general, estamos acostumbrados a omitir "super".
    • Caso especial: Cuando se define una propiedad con el mismo nombre en la subclase y la clase padre, si queremos llamar a la propiedad declarada en la clase padre en la subclase, debemos usar explícitamente el método "super. property" para indicar el llamando Es un atributo declarado en la clase padre, de lo contrario, el valor predeterminado es llamar al atributo de la subclase.
    • Caso especial: cuando una subclase reescribe el método en la clase principal, cuando queremos llamar al método anulado en la clase principal en el método de la subclase, debemos usar explícitamente el "super". El método anulado en la clase principal se llama , de lo contrario, el método de la subclase se llama de forma predeterminada.
  • super llama al constructor
    • Podemos usar explícitamente el método "super (lista de parámetros)" en el constructor de la subclase para llamar al constructor especificado declarado en la clase principal
    • El uso de "super(lista de parámetros)" debe declararse en la primera línea del constructor de la subclase
    • En el constructor de la clase, solo podemos elegir uno de "este (lista de parámetros)" o "super (lista de parámetros)", y no pueden aparecer al mismo tiempo
    • En la primera línea del constructor, si no hay una declaración explícita "esta (lista de parámetros)" o "super (lista de parámetros)", se llama por defecto al constructor con parámetros vacíos en la clase principal
    • Entre los múltiples constructores de la clase, al menos uno de los constructores de la clase usa "super (lista de parámetros)", llamando al constructor en la clase principal

Todo el proceso de creación de instancias de objetos de subclase.

  • A juzgar por los resultados: (herencia)
    • Una vez que la subclase hereda la clase principal, obtiene las propiedades o métodos declarados en la clase principal.
    • Cree un objeto de una subclase y, en el espacio de almacenamiento dinámico, se cargarán todos los atributos declarados en la clase principal.
  • Desde el punto de vista del proceso:
    • Cuando creamos un objeto de subclase a través del constructor de la clase principal, debemos llamar directa o indirectamente al constructor de la clase principal y luego llamar al constructor de la clase principal de la clase principal hasta que se llame a la clase java.lang.Object constructor de parámetros. Solo porque todas las estructuras de clases principales se han cargado, puede ver que hay estructuras de clases principales en la memoria, y los objetos de subclase se pueden considerar para llamar.
  • Claro: aunque se llama al constructor de la clase principal cuando se crea el objeto de la subclase, se ha creado un objeto de principio a fin, que es el objeto de la subclase de new.

13. La tercera característica orientada a objetos: polimorfismo

  • Comprender el polimorfismo: puede entenderse como múltiples formas de una cosa.
  • Que es el polimorfismo:
    • Polimorfismo de objetos: la referencia de la clase padre apunta al objeto de la subclase (o la referencia del objeto de la subclase asignada a la clase padre)
  • El uso de polimorfismo, llamadas a métodos virtuales.
    • Con el polimorfismo de objetos, solo podemos llamar al método declarado en la clase principal durante la compilación, pero en tiempo de ejecución, lo que realmente ejecutamos es que la subclase reescribe el método de la clase principal.
    • Resumen: compila, mira a la izquierda; ejecuta, mira a la derecha.
  • Requisitos previos para el uso del polimorfismo:
    • relación de herencia de clase
    • anulación del método
  • El polimorfismo de objetos solo es aplicable a métodos, no a atributos (ver a la izquierda para compilación y operación)

Diferenciar entre sobrecarga y anulación de métodos

  • La diferencia entre las dos definiciones:
    • Sobrecarga: En una misma clase se permite más de un método con el mismo nombre, siempre que su número de parámetros o tipos de parámetros sean diferentes.
    • Anular: después de que la subclase herede la clase principal, puede anular el método con el mismo nombre y los mismos parámetros en la clase principal
  • Desde un punto de vista de compilación y ejecución:
    • La sobrecarga significa que se permiten varios métodos con el mismo nombre, pero los parámetros de estos métodos son diferentes. El compilador modifica el nombre del método con el mismo nombre según las diferentes tablas de parámetros del método. Para el compilador, estos métodos con el mismo nombre son métodos diferentes. Sus direcciones de llamada están vinculadas en tiempo de compilación. La sobrecarga de Java puede incluir clases y subclases principales, es decir, las subclases pueden sobrecargar métodos con el mismo nombre y diferentes parámetros de la clase principal.
    • Entonces: para la sobrecarga, antes de que se llame al método, el método que se llamará se ha determinado en el momento de la compilación, que se denomina "enlace temprano" o "enlace estático"
    • Para el polimorfismo, el ejecutor del intérprete determinará el método específico que se llamará solo cuando se llame al método, lo que se denomina "enlace tardío" o "enlace dinámico".

instancia del operador

  • El uso de la palabra clave instanceof: una instancia de A: determine si el objeto a es una instancia de la clase A. Si es así, devuelve verdadero; si no, devuelve falso
  • Situación de uso: para evitar la aparición de ClassCastException durante la conversión descendente, primero realizamos una instancia de juicio antes de la conversión descendente y, una vez que devuelve verdadero, se realiza la conversión descendente. Si se devuelve false, no se realiza downcast.
  • Si la clase B es la clase principal de la clase A, y una instancia de A devuelve verdadero, entonces una instancia de B también devuelve verdadero

La diferencia entre == y es igual

  • == puede comparar tipos primitivos y tipos de referencia. Para tipos básicos, es para comparar valores, y para tipos de referencia, es para comparar direcciones de memoria.
  • Para equals, pertenece al método en la clase java.lang.Object, si el método no ha sido anulado, también es == por defecto, podemos ver que el método equals de String y otras clases ha sido anulado, y la clase String está en Se usa mucho en el desarrollo diario y, con el tiempo, se ha formado una vista incorrecta de que igual es un valor comparativo
  • Específicamente, depende de si el método equals de Object se reescribe en la clase personalizada para juzgar
  • Normalmente, al anular el método equals, comparará si las propiedades correspondientes en la clase son iguales

Pruebas unitarias JUnit en Java

  • Cree clases Java para pruebas unitarias. La clase Java en este punto requiere:
    • Esta clase es pública.
    • Esta clase proporciona un constructor público sin argumentos.
  • Los métodos de prueba unitaria se declaran en esta clase. En este momento, el permiso del método de prueba de unidad es público, sin valor de retorno, sin parámetros formales
  • Se requiere una anotación en este método de prueba de unidad: @Test
  • Después de escribir el código, haga clic con el botón izquierdo en el nombre del método de prueba unitaria, haga clic con el botón derecho: ejecutar como - Prueba JUnit
  • Nota: Si no hay anormalidad en el resultado de la ejecución: barra verde; si hay una excepción en el resultado de la ejecución: barra roja

14. Uso de la envoltura

tipo de datos básicos embalaje
byte Byte
corto Corto
En t Entero
largo Largo
flotar Flotar
doble Doble
booleano booleano
carbonizarse Personaje

La clase principal de Byte, Short, Integer, Long, Float, Double es Number; la clase principal de Boolean, Character es Object

Conversión entre tipos básicos, clases contenedoras y clases String

  • Tipos de datos básicos --> Clase de empaquetado: Autoboxing
  • Clase de empaquetado --> tipo de datos básicos: desembalaje automático
  • Tipo de datos básico --> Clase String: método valueOf() de la clase String
  • Clase de cadena --> tipo de datos básico: llamar al método estático parseXxx(String) de la clase contenedora correspondiente
  • Clase contenedora --> Clase String: el método toString() del objeto de la clase contenedora
// 使用parseBoolean时,如果s非空且在忽略大小写的情况下等于true,则返回true;否则返回false
public static boolean parseBoolean(String s) {
    return "true".equalsIgnoreCase(s);
}
// 三元运算符运算过程中会尽量使两边的类型一致,所以new Integer(1)被自动提升了类型
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1); // 1.0

Object o2;
if (true) {
  o2 = new Integer(1);
} else {
  o2 = new Double(2.0);
}
System.out.println(o2); // 1
  • Integer define internamente la estructura IntegerCache, e IntegerCache define Integer[], que almacena números enteros que van desde -128 a 127. Si usamos el método de autoboxing, cuando el valor asignado a Integer está en el rango de -128 a 127, podemos usar directamente los elementos de la matriz sin pasar a new. propósito de mejorar la eficiencia
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);// false

Integer m = 1;
Integer n = 1;
System.out.println(m == n);// true

Integer x = 128;
Integer y = 128;
System.out.println(x == y);// false

15. Palabra clave: estática

  • Use static para modificar atributos: variables estáticas (o variables de clase)
    • Los atributos, según se utilice la modificación estática, se dividen en: atributos estáticos frente a atributos no estáticos (variables de instancia)
      • Variables de instancia: creamos múltiples objetos de la clase, cada objeto de forma independiente tiene un conjunto de propiedades no estáticas en la clase. Al modificar una propiedad no estática de un objeto, no hará que se modifique el mismo valor de propiedad en otros objetos
      • Variable estática: creamos varios objetos de la clase y varios objetos comparten la misma variable estática. Cuando una variable estática se modifica a través de un objeto, hará que otros objetos llamen a esta variable estática, que se modifica
    • Otras instrucciones para atributos de modificación estática
      • Las variables estáticas se cargan cuando se carga la clase. Puede ser llamado por "clase.variable estática"
      • Las variables estáticas se cargan antes de que se creen los objetos
      • Dado que la clase solo se cargará una vez, solo habrá una copia de las variables estáticas en la memoria: en el campo estático del área de métodos
  • Utilice el método de modificación estática: método estático
    • Cargado con la carga de la clase, puede ser llamado por "método class.static"
    • En los métodos estáticos, solo se pueden llamar a los métodos o propiedades estáticos; en los métodos no estáticos, se pueden llamar tanto a los métodos o propiedades no estáticos como a los métodos o propiedades estáticos.
  • puntos estáticos
    • En un método estático, la palabra clave this y la palabra clave super no se pueden usar
  • Durante el desarrollo, ¿cómo determinar si una propiedad debe declararse como estática?
    • Los atributos pueden ser compartidos por varios objetos y no variarán de un objeto a otro
    • Las constantes en las clases a menudo también se declaran estáticas.
  • Durante el desarrollo, ¿cómo determinar si un método debe declararse como estático?
    • El método de manipulación de propiedades estáticas, generalmente establecido en estático.
    • El método en la clase de herramienta se declara habitualmente como estático
/**
 * 单例设计模式:
 * 1、所谓的类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。
 * 2、如何实现?
 * 	饿汉式 vs 懒汉式
 * 3、区分饿汉式和懒汉式
 * 	饿汉式:
 * 		坏处:对象加载时间过长。
 * 		好处:饿汉式是线程安全的
 * 	懒汉式:
 * 		好处:延迟对象的创建。
 * 		目前的写法坏处:线程不安全。(到多线程内容时,再修改)
 */

// 饿汉式
class Bank {
	// 1、私有化类的构造器
	private Bank() {
		
	}
	// 2、内部创建类的对象
	// 4、要求此对象也必须声明为静态的
	private static Bank instance = new Bank();
	// 3、提供公共的静态的方法,返回类的对象
	public static Bank getInstance() {
		return instance;
	}
}

// 懒汉式
class Order {
	// 1、私有化类的构造器
	private Order() {
		
	}
	// 2、声明当前类对象,没有初始化
	// 4、此对象也必须声明为static的
	private static Order instance = null;
	// 3、声明public、static的返回当前类对象的方法
	public static Order getInstance() {
		if (instance == null) {
			instance = new Order();
		}
		return instance;
	}
}

16. El cuarto miembro de la clase: bloque de código (o bloque de inicialización)

  • El papel del bloque de código: utilizado para inicializar clases y objetos.
  • Si se modifica el bloque de código, solo puede usar estático
  • Categoría: Bloques de código estático VS Bloques de código no estático
  • bloque estático
    • Puede haber declaraciones de salida dentro
    • Se ejecuta a medida que se carga la clase, y solo una vez.
    • Función: inicializar la información de la clase
    • Si se definen varios bloques de código estático en una clase, se ejecutarán en el orden en que se declararon.
    • La ejecución de bloques de código estáticos tiene prioridad sobre la ejecución de bloques de código no estáticos.
    • Solo se pueden llamar propiedades estáticas y métodos estáticos en un bloque de código estático, y no se pueden llamar estructuras no estáticas.
  • bloque de código no estático
    • Puede haber declaraciones de salida dentro
    • Se ejecuta a medida que se crea el objeto.
    • Ejecutar un bloque de código no estático cada vez que se crea un objeto
    • Función: puede inicializar las propiedades del objeto al crear el objeto
    • Si se definen varios bloques de código no estático en una clase, se ejecutarán en el orden de declaración
    • Las propiedades estáticas, los métodos estáticos o las propiedades no estáticas y los métodos no estáticos se pueden llamar en un bloque de código no estático

Resumen: de marido a hijo, primero estático

El proceso de asignación de atributos.

  • inicialización predeterminada
  • Inicialización/asignación explícita en bloque de código
  • inicialización en el constructor
  • Después de tener un objeto, puede asignarlo mediante "objeto.propiedad" u "objeto.método"

El orden de inicialización y asignación explícitas en un bloque de código depende del orden del código

17. Palabra clave: final

  • Final se puede utilizar para modificar la estructura: clase, método, variable
  • final se usa para modificar una clase: esta clase no puede ser heredada por otras clases.
  • final se utiliza para modificar el método: lo que indica que este método no se puede anular
  • final se usa para modificar variables: la "variable" en este momento se llama constante
    • Atributos de modificación final: las posiciones que se pueden considerar para la asignación son: inicialización de visualización, inicialización en bloques de código e inicialización en constructores
    • Variables locales modificadas finales: especialmente cuando se utilizan parámetros modificados finales, indica que este parámetro es una constante. Cuando llamamos a este método, asignamos un parámetro real al parámetro formal constante. Una vez asignado, este parámetro formal solo se puede usar en el cuerpo del método, pero no se puede reasignar.

static final se usa para modificar atributos: variables globales

18. Palabra clave: resumen

  • El resumen se puede utilizar para modificar la estructura: clase, método
  • clase de modificación abstracta: clase abstracta
    • Esta clase no puede ser instanciada
    • Debe haber un constructor en la clase abstracta, que es conveniente llamar cuando se crea una instancia de la subclase (lo que implica: todo el proceso de instanciación del objeto de la subclase)
    • Durante el desarrollo, se proporcionarán subclases de clases abstractas para instanciar objetos de subclase y completar operaciones relacionadas.
  • método de modificación abstracto: método abstracto
    • El método abstracto solo necesita la declaración del método, sin el cuerpo del método.
    • Una clase que contiene métodos abstractos debe ser una clase abstracta. Por el contrario, las clases abstractas no pueden tener métodos abstractos.
    • Si la subclase reescribe todos los métodos abstractos en la clase principal, se puede crear una instancia de la subclase; si la subclase no reescribe todos los métodos abstractos en la clase principal, entonces la subclase también es una clase abstracta y debe usar la modificación abstracta

Nota: el resumen no se puede usar para modificar: atributos, constructores y otras estructuras; el resumen no se puede usar para modificar métodos privados, métodos estáticos, métodos finales y clases finales

objeto anónimo

method(new Student()); //匿名对象

Worker worker = new Worker();
method1(worker); //非匿名的类非匿名的对象

method1(new Worker()); //非匿名的类匿名的对象

// 创建匿名子类的非匿名对象
Person p = new Person() {
  @Override
  public void eat() {
    System.out.println("吃东西");
  }
}

// 创建匿名子类的匿名对象
method1(new Person() {
  @Override
  public void eat() {
    System.out.println("吃东西");
  }
});

19. Palabra clave: interfaz

  • En Java, las interfaces y las clases son dos estructuras yuxtapuestas
  • Cómo definir una interfaz, definir los miembros en la interfaz
    • JDK7 y anteriores: solo se pueden definir variables globales y métodos abstractos
      • Constantes globales: público estático final, pero al escribir, puede omitirlo
      • Método abstracto: resumen público
    • JDK8: además de definir constantes globales y métodos abstractos, también se pueden definir métodos estáticos y métodos predeterminados
  • ¡Las interfaces no pueden definir constructores! significa que la interfaz no puede ser instanciada
  • En el desarrollo de Java, las interfaces se utilizan al permitir que las clases se implementen (implementos). Si la clase de implementación cubre todos los métodos abstractos en la interfaz, la clase de implementación puede instanciarse; si la clase de implementación no cubre todos los métodos abstractos en la interfaz, la clase de implementación sigue siendo una clase abstracta.
  • Las clases de Java pueden implementar múltiples interfaces: compensar las limitaciones de la herencia única de Java. Formato: clase AA extiende BB implementos CC,DD,EE
  • Las interfaces se pueden heredar y es posible la herencia múltiple. Formato: interfaz AA extiende BB,CC
  • El uso específico de la interfaz refleja polimorfismo.
  • La interfaz, de hecho, puede verse como una especificación
interface Flyable {
  // 全局变量
  public static final int MAX_SPEED = 7900;
  int MIN_SPEED = 1; // 省略了public static final

  // 抽象方法
  public abstract void fly();
  // 省略了public abstract
  void stop();
  // Interfaces cannot have constructors
  // public Flyable() {}
}
interface A {
  int x = 0;
}

class B {
  int x = 1;
}

class C extends B implements A {
  public void pX() {
    // 编译不通过,因为x是不明确的
    // System.out.println(x);
    System.out.println(super.x); // 1
    System.out.println(A.x); // 0
  }
}

JDK8: además de definir constantes globales y métodos abstractos, también se pueden definir métodos estáticos y métodos predeterminados

public interface CompareA {
  // 静态方法
  public static void method1() {
    System.out.println("CompareA:北京");
  }
  // 默认方法
  public default void method2() {
    System.out.println("CompareA:上海");
  }
  default void method3() {
    System.out.println("CompareA:上海");
  }
}

class SubClass extends SuperClass implements CompareA, CompareB {
  public void method2() {
    System.out.println("SubClass:上海");
  }
  public void method3() {
    System.out.println("SubClass:深圳");
  }
  // 知识点5:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
  public void myMethod() {
    method3();//调用了自己定义的重写的方法
    super.method3(); //调用的是父类中声明的
    //调用接口中的默认方法
    CompareA.super.method3();
    CompareB.super.method3();
  }
}

public class SubClassTest {
  public static void main(String[] args) {
    SubClass s = new SubClass();
    // 知识点1:接口中定义的静态方法,只能通过接口来调用
    // s.method1(); // 编译错误
    // SubClass.method1(); // 编译错误
    CompareA.method1();
    // 知识点2:通过实现类的对象,可以调用接口中的默认方法。
    // 如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法。
    s.method2();
    // 知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,
    // 那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法(类优先原则)。
    // 知识点4:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,
    //那么在实现类没有重写此方法的情况下,会报错——接口冲突
    //这就需要我们必须在实现类中重写此方法
    s.method3();
  }
}

20. El quinto miembro interno de la clase: clase interna

  • Java permite declarar una clase A en otra clase B, entonces la clase A es una clase interna y la clase B se llama una clase externa

  • Clasificación de clases internas: clase interna miembro (estática, no estática) VS clase interna local (en método, bloque de código, constructor)

  • Clase interna del miembro:

    • Como miembro de una clase externa:
      • estructura para llamar a clases externas
      • Puede ser modificado por estática
      • Puede ser modificado por 4 permisos diferentes
    • como una clase:
      • Las clases pueden definir propiedades, métodos, constructores, etc.
      • Se puede modificar por final, lo que indica que esta clase no se puede heredar. La implicación es que se puede heredar sin usar final
      • Puede ser modificado por resumen
  • Cómo instanciar un objeto de una clase interna miembro

// 创建Dog实例(静态的成员内部类):
Person.Dog dog = new Person.Dog();
dog.show();
// 创建Bird实例(非静态的成员内部类):
// Person.Bird bird = new Person.Bird(); // 编译错误
Person p = new Person();
Person.Bird bird = p.new Bird();
bird.sing();
  • Cómo diferenciar una estructura que llama a una clase externa en una clase interna miembro
public void sing() {
  // 调用外部类的非静态方法
  Person.this.eat();
  eat();
  // 调用外部类的非静态属性
  System.out.println(age);
}

public void display(String name) {
  System.out.println(name); // 方法的形参
  System.out.println(this.name); // 内部类的属性
  System.out.println(Person.this.name); // 外部类的属性
}
  • Uso de clases internas locales en el desarrollo.
public Comparable getComparable() {
  return new Comparable() {
    @Override
    public int compareTo(Object o) {
      return 0;
    }
  }
}
  • En el método de la clase interna local (por ejemplo: mostrar), si desea llamar a la variable local (por ejemplo: num) en el método (por ejemplo: método) declarado por la clase externa, se requiere que la variable local ser declarado como definitivo.
    • JDK 7 y versiones anteriores: requiere que esta variable local se declare explícitamente como final
    • JDK 8 y versiones posteriores: se puede omitir la declaración final
public void method() {
  //局部变量-JDK 8及之后,final可以省略
  final int num = 10;
  class AA {
    public void show () {
      // num = 20;
      System.out.print(num);
    }
  }
}
  • Las clases internas de miembros y las clases internas locales generarán archivos de código de bytes después de la compilación. Formato:
    • Miembro clase interna: clase externa $ clase interna nombre.clase
    • Clase interna parcial: clase externa $número clase interna nombre.clase

Supongo que te gusta

Origin blog.csdn.net/qq_51808107/article/details/131425785
Recomendado
Clasificación