一、类

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

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 方法载入;

 Person person = new Person();

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

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

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

 Class clazz = classLoader.loadClass("Person");
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可以直接调用父类的非私有成员。

JavaSE--类与对象的更多相关文章

  1. JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等

    一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...

  2. JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)

    一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问 ...

  3. [javase学习笔记]-6.2 类与对象的关系

    这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. ...

  4. 类与对象 - Java学习(二)

    弄清楚类与对象的本质与基本特征,是进一步学习面向对象编程语言的基本要求.面向对象程序设计与面向过程程序设计在思维上存在着很大差别,改变一种思维方式并不是一件容易的事情. 一.面向对象程序设计 程序由对 ...

  5. java 类与对象基础整理

    之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...

  6. 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;

    面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...

  7. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  8. Python - 类与对象的方法

    类与对象的方法

  9. C++基础知识(5)---类和对象

    终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...

  10. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

随机推荐

  1. 安装python第三方模块

    下载 第三方模块的下载地址:https://pypi.python.org/pypi 其他版本的第三方模块下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs ...

  2. springboot 测试发送邮件

    首先在pom文件引入依赖: <!--email依赖 --> <dependency> <groupId>org.springframework.boot</g ...

  3. GC详解

    GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...

  4. 【学习】mysql 时间戳与日期格式的相互转换

    1.UNIX时间戳转换为日期用函数: FROM_UNIXTIME() ); 输出:2006-08-22 12:11:10 2.日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP() Sel ...

  5. Spring Data概览

    总结:JpaRepository继承PagingAndSortingRepository,PagingAndSortingRepository继承CrudRespository,CrudResposi ...

  6. Ubuntu 防火墙常用配置操作(ufw)【适用于 Debian 及其衍生版---Linux Mint、Deepin 等】-转

    Ubuntu 防火墙常用配置操作(ufw)[适用于 Debian 及其衍生版---Linux Mint.Deepin 等] 点击访问

  7. 【汇总】Windows linux 敏感目录 路径汇总

    日期:2019-08-02 10:53:52 更新:2019-08-19 15:48:01 作者:Bay0net 介绍:中间件.套件等等敏感信息,做个记录. 0x01. 基本信息 遇到文件包含.任意文 ...

  8. python的一些方法

    1.如何循环获得下标,使用 enumerate ints = ['a','b','c','d','e','f'] for idx, val in enumerate(ints): print idx, ...

  9. web.xml文件的的param-name

    第一个阶段 配置阶段  web.xml配置,如下图   第二个阶段 初始化阶段  init(ServletConfig config) 1.加载配置文件 获取web.xml文件的的param-name ...

  10. lua基础学习(三)

    一.lua函数 1.在Lua中,函数是对语句和表达式进行抽象的主要方法.既可以用来处理一些特殊的工作,也可以用来计算一些值.Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print( ...