加载类和实例化它之间的区别

有人可以解释类加载和实例化类之间的区别。 当我们使用Static变量加载一个类时,它是否也在Class加载的同时实例化? 毕竟静态代码是类的一部分而不是它的个别实例。 如果有人提供了一个例子来帮助我更好地理解这一点,那将会很有帮助。

这里有一些很好的解释(有一个例子和观察)

在JVM – Java中加载和初始化类时

在Java中加载Class时

类加载由Java中的ClassLoaders完成,只要另一个类引用它或者延迟加载类直到需要进行类初始化,就可以实现类加载类。 如果Class在实际使用之前加载,它可以在初始化之前就位于内部。 我相信这可能会有所不同,从JVM到JVM。 虽然JLS保证在需要静态初始化时会加载一个类。

在Java中初始化类时

在Java中初始化类之后在类加载之后,将发生类的初始化,这意味着初始化类的所有静态成员。 在以下情况下,Java在Java中初始化:

1) 使用new()关键字或使用class.forName()的reflection创建类的实例,这可能会在Java中抛出ClassNotFoundException。

2)调用Class的静态方法。

3)分配类的静态字段。

4)使用类的静态字段,它不是常量变量。

5)如果Class是顶级类,则执行词法中嵌套在类中的断言语句。

希望有所帮助。

Integer.toString(123); 

对于上面的静态方法调用,必须加载Integer类。

 Integer i = new Integer(123); 

在上面的代码中,我创建了一个Integer类的实例(对象)(显然也必须加载它才能使其工作)。

某些类不是要实例化的(例如,Math类,它只有静态方法)。

类加载
每当JVM确定它需要一个类(使用它的静态变量,创建一个新对象,使用它的静态方法等)时,它将加载类,静态初始化块将运行,静态变量被初始化等。 这是(在至少在正常情况下)只做一次

 SomeClass.someStaticMethod(); //SomeClass is loaded (if its not already) SomeClass.someStaticVariable; //SomeClass is loaded (if its not already) SomeClass var=new SomeClass(); //SomeClass is BOTH loaded (if its not already) AND instantiated 

结果是以下运行(作为示例):

 static Vector3d var=new Vector3d(); //static variables are initialised static{ //static initialisation block are run } 

实例化一个类
另一方面,在使用new关键字创建类的实例时, 实例化一个类 ; 实例化一个类正在创建该类的对象。

 SomeClass var=new SomeClass(); //SomeClass is instantiating (and loaded if its not already) 

结果构造函数运行:

 public SomeClass(){ } 

 { //initialisation block(s) also run (but these are very uncommonly used) } 

类加载器实际上将字节代码加载到JVM中,运行静态初始化器。当你想在类中使用静态字段而不创建它的实例时,必须首先通过类加载器加载类。java中的默认类加载器是java.lang.ClassLoader 。这个类加载只进行一次。
类实例化是在内存中创建类的实例。我们可以使用new实现类.Class实例化可以多次完成。 例如: Animal a=new Animal();

更多关于类加载

引用类时会加载一个类(例如,通过Class.forName() )。

您可以通过创建实例来实例化对象,例如

 Object o = new Object(); 

您还可以使用reflection实例化对象。

例如,在加载类时,类的static成员会被实例化

 public class Sample { private static int variable = 10; } 

当我现在加载类时(例如,通过Class.forName("Sample"); )然后使用值10初始化变量variable

如果您正在创建一个类的新实例,并且在该类之前将被加载(atomatically)之前未加载它。 因此,只有在特殊情况下才需要构造Class.forName() (如果编译时不知道该类,例如)。