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 方法载入;
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--类与对象的更多相关文章
- JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等
		一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ... 
- JavaSE基础知识(5)—面向对象(5.1类和对象概念、创建及内存分配)
		一.类和对象的相关概念 1.面向对象和面向过程的理解 面向对象和面向过程都属于解决问题的思考方式.面向过程:以执行者的角度思考问题,侧重于“怎么做”,比较适合解决小型项目面向对象:以指挥者的角度思考问 ... 
- [javase学习笔记]-6.2 类与对象的关系
		这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. ... 
- 类与对象 - Java学习(二)
		弄清楚类与对象的本质与基本特征,是进一步学习面向对象编程语言的基本要求.面向对象程序设计与面向过程程序设计在思维上存在着很大差别,改变一种思维方式并不是一件容易的事情. 一.面向对象程序设计 程序由对 ... 
- java 类与对象基础整理
		之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ... 
- 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;
		面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ... 
- Java编程里的类和对象
		像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ... 
- Python - 类与对象的方法
		类与对象的方法 
- C++基础知识(5)---类和对象
		终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ... 
- 简述JavaScript对象、数组对象与类数组对象
		问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ... 
随机推荐
- BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)
			题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ... 
- volatile学习
			第一.java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之 ... 
- R_Studio(关联)对Groceries数据集进行关联分析
			RGui的arules程序包里含有Groceries数据集,该数据集是某个杂货店一个月真实的交易记录,共有9835条消费记录,169个商品 #install.packages("arules ... 
- python学习之路(16)
			Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ... 
- C++入门经典-例2.11-流输出小数控制
			1:代码如下: // 2.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ... 
- 《信息安全系统设计基础》--Myod
			Myod 回顾Makefile 任务详情 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Mak ... 
- es6 的数组的方法
			es6 数组的拓展 数组的类 Array 数组的定义: 1. var arr=[]; 2. var arr=new Array(3) // 3 代表有三个元素 arr[0]=12; arr[1]=24 ... 
- Dubbo HA 高可用
			一.zookeeper 宕机 现象:zookeeper 注册中心宕机,还可以消费 dubbo 暴露的服务 健壮性  监控中心宕掉不影响使用,只是丢失部分采样数据  数据库宕掉后,注册中心仍能通过缓 ... 
- Android 中数据存储方式有哪些?
			a) 文件存储b) xml,SharedPreferencec) SQLite数据库d) ContentProvidere) 网络 
- react综合案例-todolist、localstorage缓存数据
			1.工具类storage.js var app ={ set(key,value){ localStorage.setItem(key,JSON.stringify(value)); }, get(k ... 
