zoukankan      html  css  js  c++  java
  • JavaSE类与对象

    一、类

      类是具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

    1.类加载

      首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、转换解析、初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制。

      类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个类装载器:Bootstrap(启动装载器)、Extension(扩展类装载器)和System(系统类装载器)。其中启动装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,启动装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtensionClassLoader和SystemClassLoader都是ClassLoader的子类。其中ExtensionClassLoader负责装载JRE目录ext中的JAR类包;SystemClassLoader负责装载ClassPath路径下的类包。

    2.类加载器

    ①启动(Bootstrap)类加载器

      启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将 <JAVA_HOME>/lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,注意必由于虚拟机是按照文件名识别加载jar包的,如rt.jar,如果文件名不被虚拟机识别,即使把jar包丢到lib目录下也是没有作用的(出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类)。

    扩展(Extension)类加载器

      扩展类加载器是指Sun公司(已被Oracle收购)实现的sun.misc.Launcher$ExtClassLoader类,由Java语言实现的,是Launcher的静态内部类,它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准扩展类加载器。

    ③系统(System)类加载器

      系统类加载器是指Sun公司实现的sun.misc.Launcher$AppClassLoader,它负责加载系统类路径java - classpath或 -D java.class.path 指定路径下的类库,也就是我们经常用到的classpath路径,开发者可以直接使用系统类加载器对自己编写的类进行加载,一般情况下该类加载是程序中默认的类加载器,通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器。

      在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,需要注意的是,Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式即把请求交由父类处理,它一种任务委派模式,下面我们进一步了解它。

    3.触发类加载的方式

    ①由new关键字创建一个类的实例,在由运行时刻用 new 方法载入;

    1 Person person = new Person();

    ②使用Class.forName(),通过反射加载类型,并创建对象实例;

    1 Class clazz = Class.forName("Person");
    2 Object person =clazz.newInstance();

    ③使用某个ClassLoader实例的loadClass()方法,通过该 ClassLoader 实例的 loadClass()方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。

    1 Class clazz = classLoader.loadClass("Person");
    2 Object person = clazz.newInstance();

    4.类的加载流程

      类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:

    ①装载:查找和导入Class文件;

    ②链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:

      校验:检查载入Class文件数据的正确性;

      准备:给类的静态变量分配存储空间;

      解析:将符号引用转成直接引用;

    ③初始化:对类的静态变量、静态代码块执行初始化工作。

    5.类的生命周期

      Class文件中的“类”从加载到JVM内存中,到卸载出内存过程有七个生命周期阶段。类加载机制包括了前五个阶段。如下图所示:

      其中,加载、验证、准备、初始化、卸载的开始顺序是确定的,注意,只是按顺序开始,进行与结束的顺序并不一定。解析阶段可能在初始化之后开始。

    在以下情况的时候,Java虚拟机会结束生命周期:

    • 执行了System.exit()方法
    • 程序正常执行结束
    • 程序在执行过程中遇到了异常或错误而异常终止
    • 由于操作系统出现错误而导致Java虚拟机进程终止

    6.类与对象的加载顺序

    • 类加载:加载静态方法->初始化静态变量->执行静态代码块
    • 对象实例化:先加载非静态方法->实例化非静态变量->执行构造代码块->执行构造函数

    一个全新对象的初始化过程,首先加载类,然后实例化:

    ①类加载过程:

      首先加载所有的静态方法,但不执行

      然后按照静态变量的顺序开始初始化

      静态变量初始化完毕后执行静态构造块(不执行构造块)

      此时类加载完毕

    ②实例化过程:

      加载非静态方法

      初始化非静态变量

      执行构造代码块

      执行构造函数

      此时实例化完毕

    二、对象

      对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

    1.对象实例化过程

    ①加载指定类的字节码文件进内存

    ②通过new在对内存中开辟空间,分配首地址值

    ③对对象中的属性进行默认初始化 

    ④调用与之对应的构造函数,使得构造函数入栈

    ⑤构造函数先执行隐式语句super先给父类进行初始化

    ⑥对对象属性进行显示初始化

    • 定义属性时对属性的赋值

    ⑦调用类中的构造代码块

    • 非静态代码块对属性的赋值

    ⑧执行构造函数中的自定义初始化语句

    • ⑥⑦⑧中的赋值代码顺序决定了他们在构造函数中的位置,因为所有的显示初始化都是统一在构造函数中实现的,他们的优先级高于构造器中其他语句

    ⑨初始化完成将对象地址赋给指定的对象引用

    2.构造函数

      当你没有定义构造函数时JVM会默认提供一个无参构造函数,当你定义了一个有参的构造函数时JVM将不再提供任何构造函数,构造函数唯一可用的修饰符就是访问权限修饰符(public protected private default),构造函数不允许有返回值类型,但可以使用return关键字结束构造函数。构造函数不会被子类继承,当然也就不会被覆盖。

    3.this与super

      this代表当前对象的引用,只要被对象调用的方法都会有this引用(凡是访问了对象的属性的方法都持有this指针),所以this存在依赖于对象,即静态区没有this。this可以取得当前类的所有成员,还可以取得父类未被覆盖的非私有方法,用户调用构造函数的this语句必须定义在构造函数的第一行,因为初始化工作要先执行。

      super代表子类中的父类区域,实质还是子类对象的引用,JVM会根据关键字名来确定是否指向父类成员,super可以直接调用父类的非私有成员。

    科学搬砖,勤劳致富
  • 相关阅读:
    自主学习1
    动手动脑10.28
    《程序员修炼之道》阅读笔记三
    《程序员修炼之道》阅读笔记
    11月20,21,22训练赛
    Rabbits(跳兔子)
    01背包变式(并查集+dp01背包)
    问题 I: 约会序列(两边枚举)
    问题 J: 直角三角形
    Cow Exhibition (01背包的负数处理)
  • 原文地址:https://www.cnblogs.com/tag6254/p/9404496.html
Copyright © 2011-2022 走看看