精华内容
下载资源
问答
  • 初始化接口问题
    千次阅读
    2021-03-06 14:08:07

    类的初始化由执行类中静态代码块的初始化和类中声明的静态域的初始化两部分组成

    接口的初始化由接口中声明的域(常量)的初始化组成

    初始化的时机

    类或接口T在以下任意情况发生之前会立即进行初始化:T是一个类并且创建了一个T的实列

    T中声明的一个静态方法被调用

    T中声明的一个静态域被分配(assigned)

    T中的一个静态域被使用并且该域不是一个常量变量(constant variable)

    当一个类被初始化时,它的超类也会被初始化(如果之前未被初始化的话),以及声明任何默认方法的父接口也会被初始化(如果之前未被初始化);接口自身的初始化并不会导致其父接口的初始化

    引用一个静态域(static field)只会导致实际声明该域的类进行初始化,尽管它可能通过子类名、子接口、或者实现接口的某个类名进行引用。

    调用Class类或包java.lang.reflect中的某些方法也会导致类或接口进行初始化(Class.forName).

    对于上面4种情况,我们可以举例来验证一下.下面Hello这个类声明了一个常量A,常量变量B(具体什么是常量变量可以参考《java language specification》第4.12.4节),一个静态变量c,以及两个静态代码块(23-30行)1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26public class{

    public static final int A = initA();

    public static final int B = 10;

    public static int c;

    static {

    System.out.println("Hello静态代码块加载了1.........");

    }

    /**静态代码块2*/

    static {

    System.out.println("Hello静态代码块加载了2.........");

    }

    public (){

    System.out.println("Hello构造函数初始化了........");

    }

    public static void hello(){

    System.out.println("Hello.hello方法被调用了........");

    }

    public static int initA(){

    System.out.println("Hello.initA方法被调用了........");

    return 10;

    }

    }

    接着,我们写测试类来依次验证上述4种情况.1

    2

    3

    4

    5/**测试Hello实例化*/

    public void testInstance(){

    new Hello();

    }

    可以在控制面板看到如下输出:Hello.initA方法被调用了……..

    Hello静态代码块加载了1………

    Hello静态代码块加载了2………

    Hello构造函数初始化了……..

    从输出中我们可以看到Hello类确实在实例化之前被初始化了,同时因为Hello是一个类,它的初始化包括静态代码块的执行和静态域的初始化两部分,这点从输出中也可以得到印证。首先第一行输出证明初始化了静态域A(接着是B,c这里没法从输出中直观的验证);接着第2,3行输出证明初始化执行了静态代码块1和2(静态域或静态代码块的执行顺序和声明顺序有关);最后一行表明Hello的构造函数被调用。2.测试静态方法的调用1

    2

    3

    4

    5/** 测试调用Hello的静态方法*/

    public void testStaticMethodInvoke(){

    Hello.hello();

    }

    控制面板输出:Hello.initA方法被调用了……..

    Hello静态代码块加载了1………

    Hello静态代码块加载了2………

    Hello.hello方法被调用了……..

    这里我们调用了Hello类中的静态方法getA,同理可以看到类A首先进行了初始化。3.测试静态域被分配(即赋值)1

    2

    3

    4

    5/**测试静态域被赋值*/

    @Test

    public void testStaticFieldAssigned(){

    Hello.c = 20;

    }

    控制面板输出:Hello.initA方法被调用了……..

    Hello静态代码块加载了1………

    Hello静态代码块加载了2………

    同理可以得出静态域被分配(赋值)也会触发初始化操作4.测试使用类的常量

    我们首先测试使用常量A

    1

    2

    3

    4

    5

    6/**测试调用Hello的常量A*/

    @Test

    public void testConstantA(){

    int a = Hello.A;

    System.out.println("a=" + a);

    }

    控制面板输出:Hello.initA方法被调用了……..

    Hello静态代码块加载了1………

    Hello静态代码块加载了2………

    a=10

    可以看到调用常量A触发了类Hello的初始化动作.

    再来测试使用常量B:

    1

    2

    3

    4

    5

    6/**测试调用Hello的常量B*/

    @Test

    public void testConstantVariableB(){

    int b = Hello.B;

    System.out.println("b=" + b);

    }

    控制面板输出:b=10

    会奇怪的发现控制面板只输出了b=10,而没有其他信息。也就是说使用Hello.B并没有触发Hello类的初始化动作;

    这是为什么呢?

    我们再次看第4种情况T中的一个静态域被使用并且该域不是一个常量变量(constant variable),T中一个静态域被使用也会触发类的初始化操作,但是有一个前提是该静态域必须不是一个常量变量.对于常量变量的定义可以详见java语言规范中第4.12.4节的定义,这里先简单说明一下,对于类中的用final static声明的常量字段,如果直接使用基本类型或string类型的字面量表达式直接赋了值,那么就可以认为该字段是一个常量变量.因此Hello类中的静态字段B是一个常量变量,使用它不会触发Hello类的初始化操作.5.最后测试一下如果几种情况同时出现1

    2

    3

    4

    5

    6

    7

    8/** 测试所有情况*/

    @Test

    public void testAll(){

    new Hello();

    Hello.hello();

    System.out.println("Hello.A=" + Hello.A);

    System.out.println("Hello.B=" + Hello.B);

    }

    控制面板输出:

    可以看到,类Hello只会被初始化一次。

    更多相关内容
  • java接口初始化

    千次阅读 2018-10-06 12:04:27
    接口初始化的时候编译器仍然会给接口生成一个()的类构造器,用来初始化接口中的成员变量,这点在类的初始化上也有做到。真正不同的地方在于第三点,类的初始化执行之前要求父类全部都初始化完成了,但接口的初始化...

    上文写到

    类的四种主动引用和三种被动引用

    下面来说说接口的初始化

    接口初始化的时候编译器仍然会给接口生成一个()的类构造器,用来初始化接口中的成员变量,这点在类的初始化上也有做到。真正不同的地方在于第三点,类的初始化执行之前要求父类全部都初始化完成了,但接口的初始化貌似对父接口的初始化不怎么感冒。
    也就是说,子接口初始化的时候并不要求其父接口也完成初始化,只有在真正使用到父接口的时候它才会被初始化(比如引用接口上的常量的时候啦)。

    下面分解一下一个类的加载全过程:加载->验证->准备->解析->初始化

    首先是加载:这一块虚拟机要完成3件事:

    1.通过一个类的全限定名来获取定义此类的二进制字节流。

    2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

    3.在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。

    关于第一点,很灵活,很多技术都是在这里切入,因为它并没有限定二进制流从哪里来:

    从class文件来->一般的文件加载
    从zip包中来->加载jar中的类
    从网络中来->Applet
    ……….
    相比与加载过程的其他几个阶段,加载阶段可控性最强,因为类的加载器可以用系统的,也可以用自己写的,程序猿可以用自己的方式写加载器来控制字节流的获取。

    获取二进制流获取完成后会按照jvm所需的方式保存在方法区中,同时会在java堆中实例化一个java.lang.Class对象与堆中的数据关联起来。

    加载完成后就要开始对那些字节流进行检验了(其实很多步骤是跟上面交叉进行的,比如文件格式验证):

    检验的目的:确保class文件的字节流信息符合jvm的口味,不会让jvm感到不舒服。假如class文件是由纯粹的java代码编译过来的,自然不会出现类似于数组越界、跳转到不存在的代码块等不健康的问题,因为一旦出现这种现象,编译器就会拒绝编译了。但是,跟之前说的一样,Class文件流不一定是从java源码编译过来的,也可能是从网络或者其他地方过来的,甚至你可以自己用16进制写,假如jvm不对这些数据进行校验的话,可能一些有害的字节流会让jvm完全崩溃。

    检验主要经历几个步骤:文件格式验证->元数据验证->字节码验证->符号引用验证

    文件格式验证:验证字节流是否符合Class文件格式的规范并 验证其版本是否能被当前的jvm版本所处理。ok没问题后,字节流就可以进入内存的方法区进行保存了。后面的3个校验都是在方法区进行的。

    元数据验证:对字节码描述的信息进行语义化分析,保证其描述的内容符合java语言的语法规范。

    字节码检验:最复杂,对方法体的内容进行检验,保证其在运行时不会作出什么出格的事来。

    符号引用验证:来验证一些引用的真实性与可行性,比如代码里面引了其他类,这里就要去检测一下那些来究竟是否存在;或者说代码中访问了其他类的一些属性,这里就对那些属性的可以访问行进行了检验。(这一步将为后面的解析工作打下基础)

    验证阶段很重要,但也不是必要的,假如说一些代码被反复使用并验证过可靠性了,实施阶段就可以尝试用-Xverify:none参数来关闭大部分的类验证措施,以简短类加载时间。

    接着就上面步骤完成后,就会进入准备阶段了:

    这阶段会为类变量(指那些静态变量)分配内存并设置类比那辆初始值的阶段,这些内存在方法区中进行分配。这里要说明一下,这一步只会给那些静态变量设置一个初始的值,而那些实例变量是在实例化对象时进行分配的。这里的给类变量设初始值跟类变量的赋值有点不同,比如下面:

    public static int value=123;
    在这一阶段,value的值将会是0,而不是123,因为这个时候还没开始执行任何java代码,123还是不可见的,而我们所看到的把123赋值给value的putstatic指令是程序被编译后存在于(),所以,给value赋值为123是在初始化的时候才会执行的。

    这里也有个例外:

    public static final int value=123;
    这里在准备阶段value的值就会初始化为123了。这个是说,在编译期,javac会为这个特殊的value生成一个ConstantValue属性,并在准备阶段jm就会根据这个ConstantValue的值来为value赋值了。

    完成上步后,就要进行解析了。解析好像是对类的字段,方法等东西进行转换,具体涉及到Class文件的格式内容,并没深入去了解。

    初始化过程是类加载过程的最后一步:

    在前面的类加载过程中,除了在加载阶段用户可以通过自定义类加载器参与之外,其他的动作完全有jvm主导,到了初始化这块,才开始真正执行java里面的代码。

    这一步将会执行一些预操作,注意区分在准备阶段,已经为类变量执行过一次系统赋值了。

    其实说白了,这一步就是执行程序的();方法的过程。下面我们来研究一下()方法:

    ()方法叫做类构造器方法,有编译器自动手机类中的所有类变量的赋值动作和静态语句块中的语句合并而成的,置于他们的顺序与在源文件中排列的一样。

    ();方法与类构造方法不一样,他不需要显示得调用父类的();方法,虚拟机会保证子类的();方法在执行前父类的这个方法已经执行完毕了,也就是说,虚拟机中第一个被执行的();方法肯定是java.lang.Object类的。

    下面来个例子说明一下:

    static class Parent{ 
      public static int A=1; 
      static{ 
        A=2; 
      } 
    } 
    static class Sub extends Parent{ 
      public static int B=A; 
    } 
    public static void main(String[] args){ 
      System.out.println(Sub.B); 
    } 
    

    首先Sub.B中对静态数据进行了引用,Sub类要进行初始化了。同时,其父类Parent要先进行初始化动作。Parent初始化后,A=2,所以B=2;上个过程相当于:

    static class Parent{ 
      <clinit>(){ 
        public static int A=1; 
        static{ 
          A=2; 
        } 
      } 
    } 
    static class Sub extends Parent{ 
      <clinit>(){ //jvm会先让父类的该方法执行完在执行这里 
      public static int B=A; 
      } 
    } 
    public static void main(String[] args){ 
      System.out.println(Sub.B); 
    } 
    

    ();方法对类跟接口来说不是必须的,加入类或者接口中没有对类变量进行赋值且没有静态代码块,()方法就不会被编译器生成。
    由于接口里面不能存在static{}这种静态代码块,但仍然可能存在变量初始化时的变量赋值操作,所以接口里面也会生成()构造器。但跟类的不同的是,执行子接口的()方法前并不需要执行父接口的()方法,当父接口中定义的变量被使用时,父接口才会被初始化。

    另外,接口的实现类在初始化的时候也一样不会执行接口的()方法。

    另外,jvm会保证一个类的()方法在多线程环境下能被正确地加锁同步。<因为初始化只会被执行一次>。

    下面用个例子说明一下:

    public class DeadLoopClass { 
    
      static{ 
        if(true){ 
        System.out.println("要被 ["+Thread.currentThread()+"] 初始化了,下面来一个无限循环"); 
        while(treu){}   
        } 
      } 
    
      public static void main(String[] args) { 
        System.out.println("toplaile"); 
        Runnable run=new Runnable(){ 
    
          @Override 
          public void run() { 
            // TODO Auto-generated method stub 
            System.out.println("["+Thread.currentThread()+"] 要去实例化那个类了"); 
            DeadLoopClass d=new DeadLoopClass(); 
            System.out.println("["+Thread.currentThread()+"] 完成了那个类的初始化工作"); 
    
          }}; 
    
          new Thread(run).start(); 
          new Thread(run).start(); 
      } 
    
    } 
    

    这里面,运行的时候将会看到阻塞现象。


    展开全文
  • spring初始化接口InitializingBean

    千次阅读 2018-09-08 10:21:21
    spring初始化接口InitializingBean InitializingBean接口用于初始化bean。此接口只有一个方法afterPropertiesSet, 继承此接口的bean,在bean的属性初始化会执行这个方法。 下面看一下此接口定义 /** * 当需要...

    spring初始化接口InitializingBean

    InitializingBean接口用于初始化bean。此接口只有一个方法afterPropertiesSet,
    继承此接口的bean,在bean的属性初始化会执行这个方法。

    下面看一下此接口定义

    /**
     * 当需要在BeanFactory设置完bean的所有属性后,还需做一些初始化的操作,可让该bean实现此接口
     */
    public interface InitializingBean {
    
        /**
         * 由BeanFactory在设置完bean的属性后调用
         * 该方法可用于实现bean的初始化操作,不过需要在bean的属性设置完毕后(从名字也可以看出)
         */
        void afterPropertiesSet() throws Exception;
    
    }
    

    我们可以在 AbstractAutowireCapableBeanFactory类中找到此接口的调用位置,如下:

    
    protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
                throws Throwable {
    
           //是否实现了 InitializingBean 接口
            boolean isInitializingBean = (bean instanceof InitializingBean);
            if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
                }
                if (System.getSecurityManager() != null) {
                    try {
                        AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
                            // 调用该方法
                            ((InitializingBean) bean).afterPropertiesSet();
                            return null;
                        }, getAccessControlContext());
                    }
                    catch (PrivilegedActionException pae) {
                        throw pae.getException();
                    }
                }
                else {
                   // 调用该初始化方法
                    ((InitializingBean) bean).afterPropertiesSet();
                }
            }
           // 判断是否指定了init-method方法
            if (mbd != null && bean.getClass() != NullBean.class) {
                String initMethodName = mbd.getInitMethodName();
                if (StringUtils.hasLength(initMethodName) &&
                        !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                        !mbd.isExternallyManagedInitMethod(initMethodName)) {
                    // 执行init-method 方法
                    invokeCustomInitMethod(beanName, bean, mbd);
                }
            }
        }
    

    spring还有一种初始化方式,指定 init-method 方法,如xml配置的bean

      <bean id="initAndDestroySeqBean" class="com.wthfeng.dubboapi.beans.InitAndDestroyBean" init-method="initMethod"
              destroy-method="destroyMethod"/>
    

    从源码分析可知,init-method的初始化方法在InitializingBean.afterPropertiesSet 方式之后。

    总结如下:

    1. spring有两种初始化bean的方式,实现InitializingBean接口以及配置init-method方法,两种方式可以同时使用,实现接口的方式比指定init-method先调用。
    2. 如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

    参考文章

    1. Spring核心接口之InitializingBean
    2. InitializingBean的作用
    展开全文
  • st7701S 初始化

    2020-09-30 09:41:28
    st7701S初始化代码,测试可以使用,注意三线spi的sck极性,HV和DE模式选择,更多问题可以一起交流
  • 接口初始化规则

    千次阅读 2019-09-02 19:19:38
    在JVM类加载这篇文章中,已经确定一个类在初始化时必须先行初始化其父类(如果有),我们接着来看接口初始化,我们明白接口中的成员属性都是public static final修饰的,例子中省略不写!!! 结论:当一个接口在...

    在JVM类加载这篇文章中,已经确定一个类在初始化时必须先行初始化其父类(如果有),我们接着来看接口的初始化,我们明白接口中的成员属性都是public static final修饰的,例子中省略不写!!!
    在这里插入图片描述
    结论:父接口的实例化块的内容并未输出,证明在初始化一个类时,并不会先初始化它所实现的接口,我们接着往下看!
    在这里插入图片描述
    结论:仅仅只输出子接口的实例化块的内容说明了在初始化一个接口时,并不会先初始化它的父接口,下面输出的是线程重写的toString方法不影响得出的结论!
    在这里插入图片描述
    注意:只有在真正使用到父接口的时候(如引用接口中所定义的常量时),才会初始化,这点与类不同;另外与类一样,被final修饰的静态成员变量初始化所被赋予的值不确定时(运行期确定)不会被放置在常量池当中,所以需要类运行时存在

    再来看一个例子加深类加载器准备阶段(赋默认值)与初始化阶段(赋正确值
    在这里插入图片描述
    new的时候调用构造方法,调用前给两个静态变量赋值,二者都是0然后+1,所以结果都是输出1,我们变换顺序看下面程序
    在这里插入图片描述
    这里counter1准备阶段赋值和初始化后的值都为0后,然后再进入到Singleton的构造方法中,而counter2赋默认值0后进入构造方法为1,最后再初始化值为正确值0,都是根据程序本身的执行顺序进行初始化阶段,下图进一步验证!!!
    在这里插入图片描述
    反思:上图的例子也从侧面反映了准备阶段赋予默认值的重要意义,因为在counter2进行初始化之前,也就是将它赋予正确值0之前,在构造方法中的counter2就无法进行运算,因为它没有默认值0,也反映出类加载过程的合理性!

    展开全文
  • Java接口初始化

    千次阅读 2019-11-06 22:03:27
     学习学习类初始化的时候看到了下面关于接口的两天结论: 在初始化一个类时,并不会初始化它所实现的接口初始化一个接口时,并不会先初始化它的父接口  因为接口中的变量都是 public static final 的,所以我...
  • 接口初始化方法

    千次阅读 2018-05-03 20:49:52
    实现 InitializingBean接口   &lt;bean id="testBean" class="TestClass" init-method="initialize"/&gt;   @PostConstruct   Bean在实例的过程中先后顺序也就...
  • 如何在SpringBoot启动时执行初始化操作,两个简单接口就可以实现
  • java中的变量初始化问题

    千次阅读 2021-02-12 21:31:40
    方法的参数对于第一种称为类中的成员变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。以下是各种数据类型的默认值boolean false...
  • 1、引例:判断接口有没有被初始化 public class MyTest5 { public static void main(String[] args) { System.out.println(MyChild5.b); } } interface MyParent5 { int a = 5; } interf...
  • 组态王设备初始化失败时,安装此控件通常就能立马解决问题
  • 接口只有声明没有实现,所以定义一个新接口,通常又变成声明一个新接口, 定义接口和声明接口二者通用,代表相同的意思。 最常使用的接口字面量类型就是空接口 interface{} ,由于空接口的方法集为空,所以任意类型...
  • ST7789V-初始化

    2018-08-15 09:07:18
    ST7789V-的初始化代码,适用于大部分的TFT屏,MCU接口 RGB接口 SPI接口
  • Spring启动时实现初始化的几种方式

    千次阅读 2021-06-07 14:53:07
    构造方法里初始化、@PostConstruct、InitializingBean、initMethod、ApplicationListener监听、SpringBoot的ApplicationRunner和CommandLineRunner接口
  • SpringBoot项目启动初始化InitializingBean接口与 @PostConstruct 方法 被spring管理 实现InitializingBean接口... 实现初始化接口 package com.config.redis; import com.richfit.itemcode.service.impl.Code...
  • uni-app 初始化项目

    千次阅读 2021-12-17 13:25:17
    uni-app 安装开发工具和预览工具 开发工具 ...初始化项目 创建项目 打开 Hbuilder X 创建新项目 选择 uni-app 项目 运行项目 点击运行 选择运行到 浏览器 ,运行在浏览器上 选择
  • ServletConfig接口之获取初始化参数

    千次阅读 2019-06-09 11:47:00
    ServletConfig接口 这个接口表示:servlet的信息配置对象(在web.xml中,当前servlet的配置信息) 1.接口中的方法有哪些? 1)String getServletName();获取当前servlet的名字==<servlet-name>对应的...
  • vue data初始化的两种方式

    千次阅读 2020-12-29 11:13:12
    带着这两个问题咱们一起分析下data初始化1234567891011121314151617// 代码来源于官网示例// 第一种定义方式var data = { a: 1 }// 直接创建一个实例var vm = new Vue({data: data})// Vue.extend() 中...
  • layui数据表格初始化问题

    千次阅读 2019-01-08 18:32:53
    支持【直接从接口请求数据】 注意,在第二个模式下,对入参和出参,有严格限制,甚至对返回数据格式也有要求 建议使用第一种方案 layui.use('table', function(){ var table = layui.table; var config = dp.save...
  • Java Set的初始化方法

    千次阅读 2021-02-26 16:40:43
    定义了一个Set后,我想把它初始化一下.方法一. 利用了add函数, 如下:public static void main(String[] args) {Set testSet = new HashSet();testSet.add("Monday");testSet.add("Sunday");System.out.println...
  • Html 页面初始化加载

    千次阅读 2019-08-27 17:07:16
    $(document).ready(function(){ trace("初始化方法进入"); }); $(function(){ trace("初始化方法进入二"); }); window.onload=function(){ //要初始化的东西 }
  • 锐捷网络设备初始化配置

    千次阅读 多人点赞 2022-06-21 12:41:09
    接口描述: 系统时钟: 系统时间很重要,对于故障日志、或者CA证书实施都依赖于时间戳 日志记录: 将日志记录到flash,对故障发生后查找历史日志非常有用。注意,要把日志等级配置为7才能记录debug日志 管理IP: ...
  • DDR突然初始化失败 Debug记录

    千次阅读 2021-08-10 15:22:22
    但最近有个工程中,需要增加SRIO接口,SRIO接收的数据需要先过DDR,工程编完下载bit后,偶尔会提示DDR初始化失败: 分析如下: 板卡用了很久,DDR一直没出现过初始化失败的问题,说明硬件应该没有问题; DDR IP中...
  • 基于最新Spring 5.x,详细介绍了Spring MVC 初始化流程的源码,主要包括ContextLoaderListener与根上下文容器的初始化流程的源码,以及web.xml文件加载流程。
  • 我在开发过程中,有些东西需要初始化,继承InitializingBean实现afterPropertiesSet这个方法即可。 例如: 但是我启动程序发现,并没有被加载进去 在需要被初始化的类上加个注解@Component注解,把这个类...
  • Java:错误:变量可能尚未初始化

    千次阅读 2021-02-27 19:05:42
    Java:错误:变量可能尚未初始化我正在学习Java,我收到了这个错误。我知道这已被问过几次(很多次),但没有一个答案似乎回答了我的问题。代码的主体是:String[]number={"toosmall","one","two","three","four","too...
  • bootstrap-table 初始化数据及使用问题

    千次阅读 2017-04-21 17:57:54
    bootstrap-table使用,及遇到的小问题
  • 关于Java Set的初始化方法

    千次阅读 2021-03-10 08:15:45
    定义了一个Set后,我想把它初始化一下,于是就利用了add函数, 如下:public static void main(String[] args) {Set testSet = new HashSet();testSet.add("Monday");testSet.add("Sunday");System.out.println(test...
  • 第一种方法:static块初始化 public class Demo{ private static final Map&lt;String, String&gt; myMap; static { myMap = new HashMap&lt;String, String&gt;(); myMap.put("a"...
  • 接口初始化和类初始化区别

    千次阅读 2017-11-09 20:59:10
    虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化: 1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时, 如果类还没有进行过初始化,则需要先触发其初始化。 生成这四条指令最常见...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,275,985
精华内容 510,394
热门标签
关键字:

初始化接口问题