Métodos de base de programación java en profundidad

contorno

Empezando

Visión general

La operación de bucle explicada anteriormente puede resolver el problema de la duplicación de código, pero el código repetido en este momento debe ser regular. Entonces, ¿puede la operación de bucle resolver toda la duplicación de código? La respuesta es definitivamente no. Por ejemplo, para una determinada función de operaciones repetidas, el bucle no se puede realizar. Podemos usar métodos.

Al escribir un juego de guerra de aviones, el programa necesita disparar balas continuamente durante el proceso de ejecución. Suponiendo que se deben escribir 200 líneas de código para la función de disparar balas, entonces estas 200 líneas de código deben escribirse repetidamente cada vez que se dispara una bala.Este programa es demasiado bajo. En el desarrollo, debemos seguir el principio DRY (Don't Repeat Youself) -no repitas tu propio código, porque la repetición significa muchos costos de mantenimiento, si quieres modificar el código funcional, debes modificar cada lugar repetido. ¿Te atreves a asegurarte de que se pueda cambiar cada lugar repetido? ¿No te aburres?

Para resolver el problema de la escritura repetitiva de código funcional, puede extraer el código que dispara la bala y ponerlo en un bloque de código (un par de {}), y darle a este código un nombre único, de modo que cada vez bullet is fired El código de función para disparar balas se puede llamar directamente por este nombre. A este bloque de código lo llamamos método.

Consiste en empaquetar la instrucción para ejecutar la operación para que se complete una operación de función.

ventaja

  • Haga el procedimiento más corto y claro.
  • Propicio para el mantenimiento del programa.
  • Puede mejorar la eficiencia del desarrollo del programa.
  • Reutilización de código mejorada.

Definición y uso

Formato de declaración:

[修饰符] 方法返回值类型 方法名(形参列表) {
    
     
	方法体;
	return 返回值; 
} 
//有返回值类型的方法
public static int add(int a, int b, int c ){
    
      //求和
	int k = a + b + c; 
    return k; 
}
//没有返回值的方法,没有形参
public static void printStar(){
    
     //打印5行5列的星星
	for(int i=1;i<=5;i++){
    
    
		for(int j=1;j<=5;j++){
    
    
			System.out.print("* ");
		}
		System.out.println();
	}
}
  • ** Modificador de acceso: ** El rango de permisos que el método permite acceder;

  • ** Tipo de valor de retorno: ** Si el método no devuelve ningún valor, especifíquelo como vacío; si el método tiene un valor de retorno, debe especificar el tipo de valor de retorno y utilizar la declaración de retorno en el cuerpo del método para devolver el valor;

  • ** Nombre del método: ** Defina el nombre del método, se debe usar un identificador legal, vea el significado del nombre.

  • ** Lista de parámetros formales: ** Puede haber varios parámetros. Varios parámetros están separados por comas. Cada parámetro está compuesto por el tipo de parámetro y el nombre del parámetro, separados por espacios.

transferir:

Una vez definido el método, si desea utilizarlo, debe llamarlo. Durante la llamada, el control de la llamada se transfiere del llamador del método al método. Cuando el método encuentra un retorno o} final, el derecho del llamante se devuelve al llamador. Es la rutina de "de dónde viene y a dónde ir".

方法名([实参列表])

Nota:

  • El método no se llama y no se ejecuta

  • Hay un valor de retorno, variable de recepción o recepción anónima (salida o llamada)

  • Definir método para especificar parámetros formales, método de llamada para especificar parámetros reales

  • La llamada al método requiere el mismo número de parámetros formales y parámetros reales, y los tipos coinciden

Método en profundidad

palabra clave nula

Un método nulo, no devuelve ningún valor.

public static void print() {
    
    
	for(int i=1;i<=9;i++) {
    
    
		for(int j=1;j<=i;j++) {
    
    
			System.out.print(j+"*"+i+"="+i*j+"\t");
		}
		System.out.println();//换行
	}
}

Un método con un tipo de valor de retorno debe mostrar el valor de retorno.

public static int getSum(int a,int b){
    
    
    return a+b;
}

devolver palabra clave

return es el método de salida o el valor de retorno.

Nota: no puede existir ningún código después de la devolución en un alcance

public static int getSum(int a,int b){
    
    
    return a+b;
    System.out.println("return后不能存在代码!!!"); //不可达语句
}

declaración de devolución:

  1. La declaración de devolución puede aparecer en cualquier método (con y sin valor de devolución)

  2. La declaración de retorno se usa para finalizar el método al principio de un método sin un valor de retorno

    //打印出1~5之间前两个数
    public static void test(){
          
          
        for(int i=1;i<=5;i++){
          
          
            if(i==3){
          
          
                return; //结束方法
            }
            System.out.println(i);
        }
    }
    
  3. La declaración de retorno tiene dos funciones en los métodos con valores de retorno: finalizar el método antes y enviar el resultado.

    //求出1~100之间前5个能被2整除数的和
    public static int getSum(int a,int b){
          
          
        int sum=0; //和
        for(int i=1;i<=100;i++){
          
          
            sum+=i;
            if(i==5){
          
          
                return sum; //1)提前结束方法 2) 带出返回值
            }
        }
    }
    
  4. Un método solo puede ejecutar una declaración de retorno

  5. Después de la declaración de retorno que debe ejecutarse, la declaración escrita es una declaración inalcanzable.El programa detecta automáticamente esta declaración y nunca se ejecutará, y se informará un error.

  6. Escriba una declaración después de una interrupción incondicional en el ciclo, aparecerá una declaración inalcanzable

  7. Escriba una declaración después de un bucle infinito (un bucle infinito que no termina con una ruptura), aparecerá una declaración inalcanzable

Ángulo de pensamiento

Al escribir un método, piense en estos cuatro aspectos:

1), determinar la función del método

2), determine el nombre del método

3) Si este método puede ejecutarse de forma independiente, no puede ser independiente, necesita datos externos para participar en el cálculo para determinar los parámetros formales.

4) Una vez completado este método, ¿el resultado afecta directamente las operaciones posteriores en el sitio de la llamada? Si afecta, determine el tipo de devolución; si no afecta, es nulo.

Firma

La firma del método asegura la unicidad en una clase. La firma del método solo mira el nombre del método y los parámetros formales

(Número y orden de tipos), no tiene nada que ver con el tipo de retorno del modificador y el nombre del parámetro formal.

public static void getSum(int x,int y){
    
    } -->getSum(int x,int y)为方法签名

Tipo compatible

Al llamar a un método, el formulario participa en los parámetros reales, y el tipo de recepción, el tipo de retorno y el tipo de valor de retorno deben seguir siendo compatibles.

①Parámetro formal> = parámetro actual

public static void main(String[] args) {
    
    
   // int i=5;
    byte i=5;
	int x=test(i); //i实参
}
public static int test(int d){
    
     //d形参
	return 'a';
}

②Tipo de recepción> = tipo de valor de retorno> = tipo de retorno

public static void main(String[] args) {
    
    
	int x=test(5);  //x为接收返回值的变量类型
}
//int为方法的返回值类型(规定return后面数据的值只能<=int)
public static int test(int d){
    
     //d形参
	return 'a'; //return后面数据的类型
}

Pasar por valor y pasar por referencia

Transferencia de valor y transferencia de referencia:
la denominada transferencia de valor significa que solo el valor del objeto se transfiere al objeto de destino, lo que equivale a una copia; el sistema volverá a abrir un espacio de memoria idéntico para el objeto de destino.

public static void main(String[] args) {
    
    
    byte i=5;
	test(i); //相当于test(5) -->值传递
    System.out.println(i);  //5
}
public static void test(int i){
    
     
	i++; //局部变量i++;
}

La denominada referencia significa que la dirección del objeto en la memoria se pasa al objeto de destino, lo que equivale a hacer que el objeto de destino y el objeto original correspondan al mismo espacio de almacenamiento de memoria. En este momento, si se modifica el objeto de destino, los datos en la memoria también cambiarán.

public static void main(String[] args) {
    
    
    Person p = new Person("张三",18);
	test(p); //i实参
    System.out.println(p.age); //引用传递|p指向对象的地址值
}
public static void test(Person p){
    
     
	p.age++;
}

División de memoria:

División de memoria JVM:

Características de la pila:

El modelo de memoria de la ejecución del método de tiempo descrito por la estación, cada método es llamado creará un marco de pila ()

Durante el tiempo de ejecución del programa, el análisis de memoria del método:

public class MethodTest {
    
    
	public static void main(String[] args) {
    
    
        int w=5;
        int h=7;
		int area=getArea(w,h);
		System.out.println(area);
	}
	//求面积
	public static int getArea(int w,int h) {
    
    
		return w*h;
	}
}

Proceso 1:

1) El programa debe ejecutarse. Cuando se ejecuta el comando java, la información de la clase MethodTest.class se carga en la memoria

2) La máquina virtual JVM llama al método principal, el método principal se inserta en la pila y el marco de la pila se abre para el método principal en la pila, y las variables locales que aparecen en el principal se almacenan

Int w = 5; int h = 35;

3) El método getArea () se llama en el método principal y el marco de la pila se abre para el método getArea en la pila.

4) El método empuja la pila para que se ejecute y asigna int w = 5; int h = 7; calcula el resultado y devuelve 35; devuelve el resultado al llamador del método

5) Se ejecuta el método getArea y la pila emergente libera la memoria

6) Continúe ejecutando el contenido en el método principal, almacene la variable local int area = 35 en el espacio de la pila; asigne el valor de retorno del método getArea al área

7) Después de que se ejecuta el método principal, la pila emergente libera el espacio de memoria

Sobrecarga de método

En términos generales, los métodos con los mismos puntos de función son adecuados para la sobrecarga y la sobrecarga debe cumplir los siguientes requisitos:

① Debe ser de la misma clase

② El nombre del método debe ser el mismo

③La lista de parámetros es diferente

public class Demo {
    
    
 
	//一个普通得方法,不带参数,无返回值
	public void add(){
    
    
		//method body
	}
	
	//重载上面的方法,并且带了一个整形参数,无返回值
	public void add(int a){
    
    
		//method body
	}
	
        //重载上面的方法,并且带了两个整型参数,返回值为int型
	public int add(int a,int b){
    
    
		//method body
		return 0;
	}

}

Nota: La sobrecarga de métodos no tiene nada que ver con el valor de retorno.

La lista de parámetros es diferente:

El número de parámetros es diferente.

El tipo de datos correspondiente del parámetro es diferente.

El orden de los parámetros es diferente (diferentes tipos pueden intercambiar posiciones)

Estructura recursiva

La recursividad es una forma común de resolver problemas, es decir, simplificar gradualmente el problema. La idea básica de la recursividad es llamarse a sí mismo ". Un método que utiliza tecnología de recursión se llamará a sí mismo directa o indirectamente. Mediante la recursividad, se pueden utilizar programas simples para resolver algunos problemas complejos. Por ejemplo, la mayoría de los tipos utilizan algoritmos recursivos.

La estructura recursiva consta de dos partes:

  1. Defina el encabezado recursivo. Respuesta: Cuándo no llamar a su propio método. Si no hay cabeza, caerá en un bucle sin fin.
  2. Cuerpo recursivo. Respuesta: ¿Cuándo necesitas llamar a tu propio método?
public static void print(int i) {
    
    
	System.out.println(i);
	if(i==10){
    
     //递归头
	    return; //提前结束方法
	}
	print(++i); //递归
}

public static void main(String[] args) {
    
    
	print(1);  //打印1~10之间的数据
}
public static void recursion(int i) {
    
    
	System.out.println("抱着");
	if (i==0) {
    
     //临界条件
		System.out.println("我的小鲤鱼");
	} else {
    
    
    	recursion(--i);  // 递归调用
	}
	System.out.println("的我");
}

public static void main(String[] args) {
    
    
	System.out.println("吓得我抱起了");
	recursion(2);
}

Defectos de recursividad:

Los procedimientos simples son una de las ventajas de la recursividad. Sin embargo, las llamadas recursivas ocuparán una gran cantidad de la pila del sistema y consumirán mucha memoria.Cuando hay muchos niveles de llamadas recursivas, la velocidad es mucho más lenta que los bucles. Así que tenga cuidado al volver a usarlo.

** Nota: ** Cualquier problema que pueda resolverse mediante recursividad también puede resolverse mediante iteración. Pero el método recursivo puede reflejar el problema de manera más natural y es fácil de entender y depurar, y cuando no se enfatiza la eficiencia, se puede utilizar la recursividad;

Intente evitar el uso de la recursividad cuando se requiera un alto rendimiento. Las llamadas recursivas requieren tiempo y memoria.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xyx12321/article/details/111632644
Recomendado
Clasificación