Java, et enfin revenir l'ordre d'exécution des détaillée

méthode Java est exécuté dans le cadre de pile, le cadre de pile est une unité de pile privée de fil, un fil de méthode d'exécution d'un petit espace de pile sera alloué à chacun des espaces de mémoire selon un procédé de réalisation du procédé, le cadre de pile est divisée en trois régions :

1. La pile des opérandes est utilisé pour enregistrer les opérandes de l'expression en cours d'exécution, la structure de données de l'évaluateur polynôme tirés basé sur un algorithme de pile, la pile d'opérande et le rôle

2. Les variables locales, sauf pour la variable utilisée dans le procédé, le procédé incluant les paramètres, les variables déclarées à l'intérieur des méthodes, des variables et des variables membres membres utilisées dans le procédé ou l'objet de classe (variables statiques), deux dernières variables copiés sur les variables locales, donc dans un environnement multithread, cette variable doit être déclarée comme types volatils selon les besoins

3. région d'instructions bytecode, ne pas expliquer cela, la méthode dans le code d'instruction est traduit en

déclaration retour

retour déclaration de mise en œuvre sans bloc finally. Maintenant, nous allons jeter un oeil à la déclaration de retour format déclaration de retour est suit comme:

    return [expression];

L'expression dans laquelle (expression) est facultative, car une méthode ne retourne pas de valeur, donc il n'y a pas d' expression de retour de retour, ou l' expression peut être considérée comme vide.
  Nous savons que le rôle d'une déclaration de retour peut conclure la méthode et renvoyer une valeur, de sorte que son retour est où la valeur de celui - ci? Renvoie la durée d'exécution de l' instruction de retour, la valeur de la pile d'opérandes, peu importe quel type d'expression est une expression, ce qui a il fait le travail, pas important pour l'instruction de retour, il est seul responsable de la partie supérieure des opérandes de la pile la valeur renvoyée. L'expression de retour est divisé en deux parties réalisées:

执行:expression;
执行:return指令;

Par exemple: return x + y; ce code pour effectuer x + y, puis retour exécution; de x et y est tout d' abord réalisée à partir de la copie aux variables locales des instructions de pile d'opérandes, l'addition est exécutée, cette fois , le résultat x + y la valeur stockée dans la pile d'opérandes de la pile, et enfin exécuter l'instruction de retour, la valeur de retour de la pile.
  
Pour le retour x; x premier mode de réalisation, X est une expression qui a un seul opérande, exécute la variable x est copiée à partir des variables locales aux instructions de la pile d'opérandes et l' exécution de retour, la pile de retour d'opérande valeur. Ainsi revenir x; rendement réel lorsque l'instruction de retour est exécutée, l'opérande x dans une pile ou une copie instantanée est appelé, au lieu de la valeur x.

enfin bloquer:

Si vous avez enfin la méthode de bloc, l'instruction de retour est de savoir comment mettre en œuvre? Par exemple le code suivant:

try {
    return expression;
} finally {
    do some work;
}

Tout d' abord , nous savons, finally sera exécuté, mais leur ordre d'exécution est en quelque sorte la façon dont elle? Leur ordre d'exécution est le suivant:
  
1 :. exécuter expression, l'expression est évaluée, le résultat est mémorisé dans la pile d'opérandes;

2 effectuer: la partie supérieure de l'opérande de pile (résultat de l'expression) à des variables locales en tant que valeur de retour;

3. exécuter: enfin un bloc d'instructions de code;

4. exécution: la copie de la deuxième étape à la valeur de retour des variables locales et des opérandes copie pile de retour;

5. exécuter: instruction de retour, la valeur de retour de la pile d'opérandes;

Nous pouvons voir que dans la première étape est terminée, la valeur de retour du processus global ont été identifiés, mais aussi en raison du bloc finally est exécuté, le programme renverra la valeur stockée temporairement dans les variables locales, la pile d'opérandes est utilisé pour faire enfin bloc de code d'exécution de l' instruction, et comme enfin terminé, puis stockés temporairement et recopié à la valeur de retour de la pile. Donc , peu importe l' opération à réaliser enfin bloquer, il ne peut pas affecter la valeur de retour, tentatives de modification du bloc finally la valeur de retour est futile . Donc, finalement bloc d'instructions est conçu juste pour obtenir la méthode pour effectuer quelques touches de finition importantes, et non utilisé pour calculer la valeur de retour.

Exemple de code:

public class FinallyDemo {
    public int testMethod(String _int,String _className){
        int x = 1;
        try{
            Integer.valueOf(_int);
            Class.forName(_className);
            //如果上面两句代码没有发生异常,对于return x这句代码,程序会先计算表达式x
            //即将x从局部变量区复制到操作数栈顶,结果就是操作数栈顶的值,也就是x的值,为1
            //然后将操作数栈顶的值复制到局部变量区(假设这个复制到局部变量区的值叫returnvalue),再执行finally代码块,在finally代码块
            //中,x的值被修改为3(即局部变量区中的x值),finally执行完,程序又将returnvalue复制到操作数栈顶,然后执行return指令,返回
            //操作数栈顶的值,最终返回值是1
            return x;
        }catch(ClassNotFoundException e){
            //同样发生了ClassNotFoundException,x的值被修改成2
            //因此在catch中的return x语句中定义了返回值大小为2,所以最终返回的是2
            x = 2;
            return x;
        }finally{
            //这句代码一定会执行的,这里的代码执行结束后才会结束方法并返回值,因此在finally语句修改x不会影响返回值,因为返回值在return 后面的
            //表达式执行完就已经确定了,他是x的快照,而不是x
            x = 3;
        }
    }
    public static void main(String [] args){
        try{
            FinallyDemo demo = new FinallyDemo();
            int i_1 = demo.testMethod("123123", "expert.in.java.lang.CalendarDemo");
            System.out.println(i_1);//结果为1
            int i_2 = demo.testMethod("123123", "com.edu.cn.qj.MyClass");
            System.out.println(i_2);//结果为2
            int i_3 = demo.testMethod("dsadf", "expert.in.java.lang.CalendarDemo");
            System.out.println(i_3);//没有返回值,会抛出异常
        }finally{

        }
    }
}

发布了457 篇原创文章 · 获赞 94 · 访问量 1万+

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45743799/article/details/104736962
conseillé
Classement