码迷,mamicode.com
首页 > 编程语言 > 详细

Java学习入门-06 -JVM对类的初始化的理解

时间:2020-10-08 19:15:00      阅读:20      评论:0      收藏:0      [点我收藏+]

标签:java程序   属性   ++   类变量   步骤   创建   出现   文件中   默认值   

类:与类型等价、是内存中的一个结构
实例对象:数据结构被初始化
类具有双重属性:既是类型结构,也是对象(Class对象)

从底层机制去理解

  • RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是C++中的概念,至于Java中出现RTTI的说法则是源于《Thinking in java》一书,其作用是在运行时识别一个对象的类型和类的信息。这里分为两种:
    1 传统的“RTTI”,它假定我们在编译期已经知道了所有类型(在没有反射机制创建和使用类对象时,一般都是编译期已确定其类型,如new对象时该类必须已定义好)
    2 反射机制,它允许我们在运行时发现和使用类型的信息

  • 在类初始化阶段,JVM负责对类形式初始化,主要是对类变量初始化。在JAVA类中对类变量初始化值有两种方式:
    1 声明类变量时指定初始值(实际代码Java类中未赋值的在实际初始化中会指定默认值)
    2 使用静态初始化块为类变量指定初始值

  • JVM初始化一个类步骤如下:
    1 如果这个类还没有被加载和连接,则程序先加载并连接该类
    2 如果这个类直接父类还没有被初始化,则先初始化其父类
    3 假如这个类中有初始化语句,则依次执行这些初始化语句
    4 当执行到第2个步骤时,系统对直接父类的初始化也遵循1-3步骤
    以此类推,所以JVM最先执行的类总是java.lang.Object类

  • java程序首次通过下面6种方式来使用某个类或接口,系统就会初始化该类或接口
    1 创建类的实例
    2 调用某个类方法(静态方法)
    3 访问某个类或接口,或为该类变量赋值
    4 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
    5 初始化某个类的子类,该子类的父类都会被初始化
    6 直接使用java.exe 运行某个主类。当运行主类时候,程序会先初始化该主类

  • 类加载器负责将.class文件(可能是远程也可能是本地)加载到内存中,并为之生成一个对应的java.lang.Class对象
    1 手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且对象保存在同名.class的文件中(字节码文件),比如创建一个Shapes类,编译shapes类后就会创建其包含Shapes类相关类型信息的Class对象,并保存在Shapes.class字节码文件中。
    2 每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象
    3 Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载
    4 Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要

Java学习入门-06 -JVM对类的初始化的理解

标签:java程序   属性   ++   类变量   步骤   创建   出现   文件中   默认值   

原文地址:https://blog.51cto.com/13238147/2540362

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!