java - 如何理解:在父类中如果有常量属性,在子类中使用常量属性时是不会进行父类的类加载。
巴扎黑
巴扎黑 2017-04-17 17:34:01
0
4
404

是不是因为父类编译时会生成常量,而子类在使用时已经有常量了,不需要再对父类进行加载。

巴扎黑
巴扎黑

répondre à tous(4)
Peter_Zhu

L'utilisation de blocs de code statiques et de lumières constantes statiques d'une classe ne dépend pas du chargement de la classe. Autrement dit, l’utilisation d’une variable statique d’une classe ne déclenchera pas le chargement de cette classe.

/**
 * Created by gongxufan on 3/31/16.
 */
class Parent{
    public static final String const_str = "Super";
    static{
        System.out.println("Super Class Init");
    }
    public Parent(){
        System.out.println("Super Class Init");
    }
}

class Child extends Parent{
    public static final String const_str_child = "Super";
    static {
        System.out.println("Child Class Init");
        System.out.println(const_str);
    }
}
public class SuperClassInit {
    public static void main(String[] args) {
        System.out.println(Child.const_str);
    }
}
Peter_Zhu

Lors du chargement d'une sous-classe, la classe parent sera définitivement chargée.
Dans la séquence de chargement de la JVM, la classe parent doit être chargée en premier, puis la sous-classe est initialisée.

Si je me souviens bien, l'ordre est : variables statiques de la classe parent - blocs de code statiques de la classe parent - variables statiques de la sous-classe - blocs de code statiques de la sous-classe. Je me suis peut-être mal souvenu de la commande.

左手右手慢动作

Le chargement d'une sous-classe chargera d'abord la classe parent
J'ai écrit le code ci-dessous :
Super

public class Super
{
    public static final int FIELD = 1;

    public static int FILED1 = 2;

    static {
        System.out.println("Super");
    }
}

Sous

public class Sub extends Super
{
    static {
        System.out.println("out main");
    }
    public static void main(String[] args)
    {
        System.out.println(FIELD);
        System.out.println(FILED1);
    }
}

Le résultat est :

Super

sortie principale
1
2

La classe parent sera chargée. De quel problème parlez-vous ?

刘奇

Supplément :

public class Demo {

    public static void main(String[] args) {
        System.out.println(Child.const_str);
        System.out.println(Child.const_str_child);
    }
}
class Parent{
    public static final String const_str = "P";
    static{
        System.out.println("P Init");
    }
}

class Child extends Parent{
    public static final String const_str_child = "C";
    static {
        System.out.println("C Init");
    }
}

Exécuter les résultats :

P
C

Remarque :

public class Demo {

    public static void main(String[] args) {
        System.out.println(Child.const_str);
        System.out.println(Child.const_str_child);
    }
}
class Parent{
    public static String const_str = "P";
    static{
        System.out.println("P Init");
    }
}

class Child extends Parent{
    public static String const_str_child = "C";
    static {
        System.out.println("C Init");
    }
}

Supprimez la finale de la constante, le résultat sera :

P Init
P
C Init
C

jdk1.8
La raison pour laquelle cela se produit est que final est optimisé au moment de la compilation en raison de son immuabilité. System.out.println(Child.const_str) pointe directement vers la chaîne dans le pool constant après l'emplacement de la compilation. dans.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal