北大青鸟Java培训:创建新对象的两种方法?
今天,我们将从两个方面学习如何在java编程语言中创建新对象。
当java在一个新的对象中时,它会先检查对象所属的类是否已经加载到内存中,如果没有,它会先通过类的全限定名加载。
加载和初始化类完成后,将进行对象的创建。
让我们假设类被使用一次,这样一个对象就可以分为两个过程:加载和初始化类和创建对象。
一、类加载过程(使用这个类一次)java使用父委托模型加载类,所以在描述类加载过程之前,我们先来看一下它的工作过程:父委托模型的工作过程是:如果一个类加载器收到一个类加载请求,它不会尝试自己加载这个类,而是将这个请求委托给父类加载器来完成。每一级的类加载器都是如此,所以所有的加载请求最终都应该被发送到顶级的启动类加载器。只有当父类加载器反馈无法完成这个加载请求时(在其搜索范围内没有找到需要加载的类),子类加载器才会尝试自己加载。
使用父委托机制的好处是可以有效保证一个类的全局性质。当程序中有多个具有相同限定名的类时,类装入器在装入时总是只装入其中的一个。
1.类加载器负责根据类的全限定名读取类的二进制字节,存储在运行时内存区的方法区,然后转换成目标类型对应的java.lang.Class对象实例。2.验证格式验证:验证是否符合类文件规范语义验证:检查标记为final的类型是否包含子类;检查类中的最终方法是否被子类重写;确保父类和子类之间没有不兼容的方法声明(比如方法签名相同,但是方法的返回值不同)操作验证:操作数栈中的数据必须正确操作,常量池中的各种符号引用都要验证(通常在解析阶段,通过符号引用中描述的全限定名检查是否可以定位到指定类型上,类成员信息的访问修饰符是否允许访问等。) 3.准备为类中的所有静态变量分配内存空间,并为它们设置一个初始值(因为对象还没有生成,实例变量不在此操作范围内),final修改的静态变量(常量)会直接赋值;4.将常量池中的符号引用解析成直接引用(在内存中获取类或字段和方法的指针或偏移量以便直接调用方法),初始化后即可执行。
解析需要静态绑定的内容。
//所有不会被重写的方法和字段都将被静态绑定。以上三个阶段也称为链接阶段。链接阶段需要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中。
5.初始化(父先于子)4.1给静态变量赋值4.2执行静态代码块注意:静态代码块只能被jvm调用。如果一个类需要被多个线程同时初始化,那么只能允许一个线程初始化它,其他线程必须等待。只有在活动线程完成初始化该类后,等待的其他线程才会得到通知。
因为子类依赖于父类,所以类的加载顺序是先加载父类,再加载子类,初始化也是如此。
但是,当父类初始化时,子类的静态变量的值也是默认值。
最后,方法区将存储当前类的类信息,包括类静态变量、类初始化代码(定义静态变量时的赋值语句和静态初始化代码块)、实例变量定义、实例初始化代码(定义实例变量时的赋值语句实例代码块和构造方法)和实例方法,以及父类的类信息引用。
2.创建对象1。在堆区域中分配对象所需的内存。分配的内存包括该类和父类的所有实例变量,但不包括任何静态变量。2.为所有实例变量分配默认值,将方法区域中实例变量的定义复制到堆区域,然后分配默认值。3.执行实例初始化代码的初始化顺序是先初始化父类,再初始化子类。初始化时,首先执行实例代码块,然后执行构造方法。4.如果有Childc=newChild()形式的C引用,在堆栈区定义子类型引用变量C,然后将堆区对象的地址赋给它。需要注意的是,辽宁It培训/发现每个子类对象都持有父类对象的引用,父类对象内部可以通过super关键字调用,外部不可访问。