一、类

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

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. A. Blackjack

    A. Blackjack time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. 4000余字为你讲透Codis内部工作原理

    一.引言 Codis是一个分布式 Redis 解决方案,可以管理数量巨大的Redis节点.个推作为专业的第三方推送服务商,多年来专注于为开发者提供高效稳定的消息推送服务.每天通过个推平台下发的消息数量 ...

  3. 编译一个需要用特定key前面的应用程序

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory L ...

  4. SSH上传文件出现error

    如上图,因为我在SSH上的用户没有对Linux服务器的文件夹的修改权限,我在linux上把文件夹的权限改为可读可改,就可以了

  5. JS基础_Null和Undefind

    1.Null Null类型的值只有一个值,就是null null专门用来表示一个为空的对象 var a=null; console.log(a);//nulltypeof a //object 2.U ...

  6. maven仓库,snapshot快照仓库和release发布仓库的区别

    首先看下snapshot类型 建立一个maven-privider项目,版本定义为1.1-SNAPSHOT 创建一个privider类,写一个hello()方法,并推送maven私有仓库 然后再建立一 ...

  7. Docker-----deepin系统下docker安装registry

    环境说明 一个坑逼的环境,也不能说坑逼,国产化的需求嘛. root@node22:/registry# uname -a Linux node22 4.4.15-deepin-aere #137 SM ...

  8. leetcode 215 第K个最大的元素

    此问题可转化为Top K问题进行考虑,当用小顶堆选出K个最大值时,堆顶的元素即为第k大的元素 class Solution { public: int findKthLargest(vector< ...

  9. hadoop 配置注意

    到目前为止,关于配置1.*版本的hadoop书籍占多数,前面配置2.*失败以后照着书籍配置1.2.1成功. 准备工具:(注意用统一位数的,我的64位) hadoop1.2.1 jdk1.6 xshel ...

  10. Android EditText方框验证码 短信验证码的实现

    package com.loaderman.securitycodedemo; import android.graphics.Color; import android.support.v7.app ...