一、类

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

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可以直接调用父类的非私有成员。

转载于:https://www.cnblogs.com/tag6254/p/9404496.html

JavaSE--类与对象相关推荐

  1. javaSE类与对象(上篇)

    目录君 1.类的定义与使用 2.类的实例化(new关键字创建对象) 3.创建对象的过程 4.类和对象的关系 5.什么是this引用 6.this引用的作用与特性 7.对象的构造及初始化 构造函数 构造 ...

  2. javaSE各阶段练习题---面向对象-类与对象、封装、构造方法(1

    1-8题抽查提问,能够使用给自己的语言表述 1.什么是面向对象?1.是一种编程思想JAVA语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想.我们在面向对象思想的指引下, 使用java ...

  3. JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)

    第1节 面向对象基础 一.面向对象思想 1.1 概述 面向对象(Object Oriented)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算 ...

  4. javaSE探赜索隐之三--<类与对象的爱恨情仇下>

    封装 封装就是将类的某些信息隐藏在类的内部,不允许外部直接访问.而是通过该类提供的方法对隐藏的信息进行访问. public class Person {//隐藏类的信息,这样外部就不能访问privat ...

  5. 【JavaSE】类和对象

    文章目录 面向对象设计概述 认识类 类的定义格式 对象特征 类的实例化 类和对象的关系 自定义类 构造器 封装的优点 this关键字 final实例域 静态域和静态方法 静态域和静态成员变量 静态方法 ...

  6. 【JavaSE】类和对象 (二) —— 封装、包以及 static 关键字

    目录 1. 封装 1.1 封装的概念 1.2 访问限定符 2. 包 2.1 包的概念 2.2 导入包中的类 2.3 自定义包 2.3.1 包的基本规则 2.3.2 创建一个包 2.4 包访问权限--d ...

  7. JavaSE笔记 类与对象

    类与对象 文章目录 类与对象 1. 引用 步骤 1 : 引用和指向 步骤 2 : 多个引用,一个对象 步骤 3 : 一个引用,多个对象 步骤 4 : 练习-引用 2. 继承 步骤 1 : 物品类Ite ...

  8. 【JavaSE】Java类和对象(重点详解)_Java SE

    ✨作者:@小孙的代码分享 ✨专栏:<Java SE> ✨送给各位的一句话:空杯心态 才能学到新知 ✨希望大家看完博客可以有所收获,别忘了,点赞+评论! 1.面向对象 我们开始学习编程遇到了 ...

  9. java类与对象实验报告心得体会_java上机实验心得体会报告(大全五篇)

    北京联合大学信息学院 "面向对象程序设计"课程上机实验报告 题目: JAVA上机实验心得体会 姓名(学号): 专业:计算机科学与技术 编制时间: 2012年12月19日 版本: 1 ...

  10. day06_类与对象

    面向对象_day01 学习目标: 1. 面向过程与面向对象编程思想 2. 类的定义与对象的创建 3. 匿名对象 4. 类的成员详细讲解 视频教程:https://www.bilibili.com/vi ...

最新文章

  1. JavaScript PHP模仿C#中string.format效果
  2. 魔方阵(奇数,单偶,双偶)
  3. mysql privileges
  4. 【干货】陆奇:新格局下的创业创新机会.pdf(附下载链接)
  5. jQuery幸运大转盘_jQuery+PHP抽奖程序
  6. 使用PowerDesinger 正向工程
  7. 大量数据table_一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
  8. android.appwidget-AppWidgetManager
  9. 家庭一台电脑多人上网方法
  10. loadrunner录制手机app脚本
  11. 出外旅游,应该如何换汇最划算——人民币兑换外币手续费成本最低经验谈,如美元澳元日元欧元英镑新元港币...
  12. 1425: PIPI的消消乐Ⅴ
  13. 78岁老人爱上玩乐器硬是学会了吹奏萨克斯
  14. 关于NN以及BP的一些网络上整理的资料
  15. ARCGIS格式转CAD时保留其图层、高程及颜色的方法
  16. 计算机组成原理第一章作业,计算机组成原理第一章习题答案(作业).doc
  17. 阿里一二三面、HR面面经-后台
  18. 【C语言学习】输入输出
  19. 2023 情人节表白单页源码
  20. 网络流专题班例题和练习

热门文章

  1. 计算机语言疾病矫治操作流程,言语矫治专家决策系统的构建.doc
  2. kubernetes视频教程笔记 (12)-容器探针
  3. linux mysql 数据库同步
  4. 陕西师范大学计算机专业录取,陕西师范大学计算机类专业2016年在湖北理科高考录取最低分数线...
  5. matlab选择语句函数,Matlab基本语句和基本函数
  6. C++ sort()函数
  7. 还在重复写空指针检查代码?考虑使用 Optional 吧!
  8. PHP Opcache(ZendOptimizerPlus)的安装配置详解
  9. LayaAir UI 组件 # Image 位图、Label 标签
  10. MySql 5.7.26(MySQL8)安装教程