Maison >Java >javaDidacticiel >Récrire: Quelles sont les manières de référencer des classes Java ?

Récrire: Quelles sont les manières de référencer des classes Java ?

PHPz
PHPzavant
2023-05-10 09:28:081228parcourir

1. La référence active d'une classe provoquera certainement l'initialisation de la classe. Au démarrage de la machine virtuelle, initialisez d'abord la classe où se trouve la méthode principale

Instanciez un objet de la classe

Appelez les membres statiques (sauf les constantes finales) et les méthodes statiques de la classe

Utilisez la méthode du java Package .lang.reflect pour effectuer l'appel de réflexion de classe

Lors de l'initialisation d'une classe, si sa classe parent n'a pas été initialisée, sa classe parent sera initialisée en premier

2. Référence passive de la classe, pas d'initialisation de la classe. se produira

Lors de l'accès à un champ statique, seule la classe qui déclare réellement ce champ sera initialisée. Par exemple : lors du référencement de variables statiques de la classe parent via une sous-classe, cela n'entraînera pas l'initialisation de la sous-classe.

La définition de références de classe via des tableaux ne déclenchera pas l'initialisation de cette classe.

Le référencement des constantes ne déclenchera pas l'initialisation. de cette classe (les constantes sont en phase de liaison) Elle est stockée dans le pool de constantes de la classe appelante)

Instance

package com.volcano.reflection;
//什么时候会发生类的初始化,除了第一个注释一直开着,其他都要独立打开测试,否则不准确
public class TestReflection3 {
    static {
        //1.虚拟机启动就会最先初始化main方法所在的类 会
        System.out.println("main方法被加载");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //2.实例化一个对象 会
        //new Father();
        //3.调用类的静态成员(除了final常量)和静态方法 会
        //System.out.println(Son.a);
        //4.使用java.lang.reflect包的方法对类进行反射调用 会
        //Class cls = Class.forName("com.volcano.reflection.Father");
        //5.当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类 会
        //new Son();
 
        //6.当访问一个静态域时,只有真正声明这个域的类才会被初始化 不会
        //System.out.println(Father.a);//两个都是只加载Father
        //System.out.println(Son.a);//因为a是Father的静态成员
        //7.通过数组定义类引用,不会触发此类的初始化 不会
        //Father[] fathers = new Father[10];
        //8.引用常量不会触发此类的初始化 不会
        //System.out.println(Father.B);
 
    }
}
class Father{
    static {
        System.out.println("Father被加载");
    }
    static int a=100;
    static final int B = 300;
}
class Son extends Father{
    static {
        System.out.println("Son被加载");
    }
    static int c=200;
 
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer