Méthodes de base de programmation Java en profondeur

Contour

Commencer

Aperçu

L'opération de boucle expliquée précédemment peut résoudre le problème de la duplication de code, mais le code répété à ce stade doit être régulier. Alors, l'opération de boucle peut-elle résoudre toute la duplication de code? La réponse est certainement non. Par exemple, pour une certaine fonction d'opérations répétées, la boucle ne peut pas être réalisée. Nous pouvons utiliser des méthodes.

Lors de l'écriture d'un jeu de guerre d'avion, le programme doit tirer des balles en continu pendant le processus en cours. En supposant que 200 lignes de code doivent être écrites pour la fonction de tir de balles, alors ces 200 lignes de code doivent être écrites à chaque fois qu'une balle est tirée. Un tel programme est trop bas. Dans le développement, nous devons suivre le principe DRY (Don't Repeat Youself) - ne pas répéter votre propre code, car la répétition signifie beaucoup de coûts de maintenance. Si vous voulez modifier le code fonctionnel, vous devez modifier chaque endroit répété. Oserez-vous vous assurer que chaque endroit répété peut être changé? Vous ne vous ennuyez pas?

Afin de résoudre le problème de l'écriture répétitive du code fonctionnel, vous pouvez extraire le code qui déclenche la balle et le mettre dans un bloc de code (une paire de {}), et donner à ce code un nom unique, de sorte qu'à chaque fois un bullet is fired Le code de fonction pour tirer des balles peut être appelé directement par ce nom. Nous appelons ce bloc de code une méthode.

Est de regrouper l'instruction pour exécuter l'opération pour une opération de fonction est terminée.

avantage

  • Rendez la procédure plus courte et plus claire.
  • Propice à la maintenance du programme.
  • Peut améliorer l'efficacité de l'élaboration des programmes.
  • Réutilisation améliorée du code.

Définition et utilisation

Format du relevé:

[修饰符] 方法返回值类型 方法名(形参列表) {
    
     
	方法体;
	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();
	}
}
  • ** Modificateur d'accès: ** La plage d'autorisations que la méthode permet d'accéder;

  • ** Type de valeur de retour: ** Si la méthode ne renvoie aucune valeur, spécifiez-la comme void; si la méthode a une valeur de retour, vous devez spécifier le type de la valeur de retour et utiliser l'instruction return dans le corps de la méthode pour renvoyer la valeur;

  • ** Nom de la méthode: ** Définissez le nom de la méthode, un identifiant légal doit être utilisé, voir la signification du nom.

  • ** Liste de paramètres formelle: ** Il peut y avoir plusieurs paramètres. Plusieurs paramètres sont séparés par des virgules. Chaque paramètre est composé d'un type de paramètre et d'un nom de paramètre, séparés par des espaces.

transfert:

Une fois la méthode définie, si vous souhaitez l'utiliser, vous devez l'appeler. Pendant l'appel, le contrôle de l'appel est transféré de l'appelant de la méthode à la méthode. Lorsque la méthode rencontre un retour ou une fin}, le droit de l'appelant est renvoyé à l'appelant. C'est la routine «d'où venir d'où aller».

方法名([实参列表])

Remarque:

  • La méthode n'est ni appelée ni exécutée

  • Il y a une valeur de retour, une variable de réception ou une réception anonyme (sortie ou appel)

  • Définir la méthode pour spécifier les paramètres formels, appeler la méthode pour spécifier les paramètres réels

  • L'appel de méthode nécessite le même nombre de paramètres formels et de paramètres réels, et les types correspondent

Méthode en profondeur

mot-clé void

Une méthode void, elle ne renvoie aucune valeur.

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();//换行
	}
}

Une méthode avec un type de valeur de retour doit faire ressortir la valeur de retour.

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

mot-clé de retour

return est la méthode de sortie ou la valeur de retour.

Remarque: aucun code ne peut exister après retour dans une portée

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

déclaration de retour:

  1. L'instruction return peut apparaître dans n'importe quelle méthode (avec et sans valeur de retour)

  2. L'instruction return est utilisée pour terminer la méthode au début d'une méthode sans valeur de retour

    //打印出1~5之间前两个数
    public static void test(){
          
          
        for(int i=1;i<=5;i++){
          
          
            if(i==3){
          
          
                return; //结束方法
            }
            System.out.println(i);
        }
    }
    
  3. L'instruction return a deux fonctions dans les méthodes avec des valeurs de retour: terminer la méthode tôt et envoyer le résultat.

    //求出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. Une méthode ne peut exécuter qu'une seule instruction return

  5. Après l'instruction return qui doit être exécutée, l'instruction écrite est une instruction inaccessible. Le programme détecte automatiquement cette instruction et ne sera jamais exécutée, et une erreur sera signalée.

  6. Ecrire une instruction après une rupture inconditionnelle dans la boucle, une instruction inaccessible apparaîtra

  7. Ecrire une instruction après une boucle infinie (une boucle infinie qui ne se termine pas par une pause), une instruction inaccessible apparaîtra

Angle de réflexion

Lorsque vous écrivez une méthode, pensez à ces quatre aspects:

1), déterminez la fonction de la méthode

2), déterminez le nom de la méthode

3) Que cette méthode puisse fonctionner indépendamment, elle ne peut pas être indépendante, elle a besoin de données externes pour participer au calcul afin de déterminer les paramètres formels.

4) Une fois cette méthode terminée, le résultat affecte-t-il directement les opérations suivantes sur le site d'appel? S'il affecte, déterminez le type de retour; s'il n'affecte pas, il est nul

Signature

La signature de la méthode garantit l'unicité dans une classe. La signature de la méthode ne regarde que le nom de la méthode et les paramètres formels

(Nombre et ordre des types), n'a rien à voir avec le type de retour du modificateur et le nom du paramètre formel.

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

Type compatible

Lors de l'appel d'une méthode, le formulaire participe aux paramètres réels et le type de réception, le type de retour et le type de valeur de retour doivent rester compatibles.

①Paramètre formel> = paramètre réel

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';
}

②Type de réception> = type de valeur de retour> = type de retour

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

Passer par valeur et passer par référence

Transfert de valeur et transfert de référence: le transfert
dit de valeur signifie que seule la valeur de l'objet est transférée à l'objet cible, ce qui équivaut à une copie; le système rouvrira un espace mémoire identique pour l'objet cible.

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 soi-disant référence signifie que l'adresse de l'objet dans la mémoire est transmise à l'objet cible, ce qui équivaut à faire correspondre l'objet cible et l'objet d'origine au même espace de stockage mémoire. À ce stade, si l'objet cible est modifié, les données en mémoire changeront également.

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++;
}

Division de la mémoire:

Division de la mémoire JVM:

Caractéristiques de la pile:

Le modèle de mémoire de l'exécution de la méthode temporelle décrite par la station, chaque méthode est appelée créera une pile frame ()

Lors de l'exécution du programme, l'analyse mémoire de la méthode:

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;
	}
}

Processus 1:

1) Le programme doit s'exécuter. Lorsque la commande java est exécutée, les informations de classe MethodTest.class sont chargées dans la mémoire

2) La machine virtuelle JVM appelle la méthode main, la méthode principale est poussée sur la pile, et le cadre de la pile est ouvert pour la méthode principale dans la pile, et les variables locales apparaissant dans le main sont stockées

Int w = 5; int h = 35;

3) La méthode getArea () est appelée dans la méthode main, et le cadre de la pile est ouvert pour la méthode getArea dans la pile

4) La méthode pousse la pile à exécuter et assigne int w = 5; int h = 7; calcule le résultat et renvoie 35; renvoie le résultat à l'appelant de la méthode

5) La méthode getArea est exécutée et la pile pop libère la mémoire

6) Continuez à exécuter le contenu dans la méthode principale, stockez la variable locale int area = 35 dans l'espace de pile; affectez la valeur de retour de la méthode getArea à la zone

7) Une fois la méthode principale exécutée, la pile pop libère l'espace mémoire

Méthode OverLoad

De manière générale, les méthodes avec les mêmes points de fonction conviennent à la surcharge, et la surcharge doit répondre aux exigences suivantes:

① Doit être de la même classe

② Le nom de la méthode doit être le même

③La liste des paramètres est différente

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;
	}

}

Remarque: la surcharge de méthode n'a rien à voir avec la valeur de retour.

La liste des paramètres est différente:

Le nombre de paramètres est différent.

Le type de données correspondant du paramètre est différent.

L'ordre des paramètres est différent (différents types peuvent échanger des positions)

Structure récursive

La récursivité est un moyen courant de résoudre des problèmes, c'est-à-dire de simplifier progressivement le problème. L'idée de base de la récursivité est de s'appeler ". Une méthode utilisant la technologie de récursivité s'appellera elle-même directement ou indirectement. En utilisant la récursivité, des programmes simples peuvent être utilisés pour résoudre certains problèmes complexes. Par exemple, la plupart des sortes utilisent des algorithmes récursifs.

La structure récursive se compose de deux parties:

  1. Définissez l'en-tête récursif. Réponse: Quand ne pas appeler sa propre méthode. S'il n'y a pas de tête, elle tombera dans une boucle sans fin.
  2. Corps récursif. Réponse: Quand devez-vous appeler votre propre méthode?
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);
}

Défauts de récursivité:

Les procédures simples sont l'un des avantages de la récursivité. Cependant, les appels récursifs occupent une grande quantité de pile système et consomment beaucoup de mémoire. Lorsqu'il existe de nombreux niveaux d'appels récursifs, la vitesse est beaucoup plus lente que les boucles. Soyez donc prudent lorsque vous l'utilisez à nouveau.

** Remarque: ** Tout problème qui peut être résolu par récursivité peut également être résolu par itération. Mais la méthode récursive peut refléter le problème plus naturellement, et est facile à comprendre et à déboguer, et lorsque l'efficacité n'est pas soulignée, la récursivité peut être utilisée;

Essayez d'éviter d'utiliser la récursivité lorsque des performances élevées sont requises. Les appels récursifs prennent du temps et de la mémoire.
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/xyx12321/article/details/111632644
conseillé
Classement