Java面试系列01(Java类加载、双亲委托机制、Java优点)

Wesley13
• 阅读 429

决定写一系列这样的文章吧,这一类的文章并不会探究到Java的底层知识,

这个系列的文章(虽然我之前的坑还没填完。。。不过还是想写一下)

可能会和之前写过的文章一些知识重复,编程大神如果想回忆一下也可以看一看。小白的话,不建议看。

因为我不会写的通俗易懂,大部分是已经被大多数人认同的定义,如果你对你的理解力很有自信,那本系列文章对你会很有用

(其实,小白只要坚持看完理解完前5、6篇文章就差不多可以很快的跟上了)

对于求职者来说,我相信本系列文章是你的不二之选。不过不会详解底层,底层的话,建议看其它的单个文章,我会写的很详细。

Java可以看作一种编程语言,也可以看作是一个行业平台。(懂的人都懂,不懂的人学着学着就懂了)

 Java的优点:简单、面向对象、多线程(这里我要推一下Go,没Go牛,是真心服)、强大(框架、核心库)、安全(异常处理机制)

java源文件(文本文件)的扩展名.java

面向对象:是一种编程时的思维概念。面向具体对象式编程。每个对象对应现实中的独立个体。

Java项目分为两个阶段:编译阶段(编译为字节码),运行阶段(字节码转换为机器码执行)。

Java平台:

  之所以说Java是个平台,是因为Java的跨平台性,通过JVM(类似于设计模式中的适配器模式,大家可以看一下)

  还有Java应用程序接口。

  JVM:Java虚拟机,在具体操作系统的内存模型架设一层Java的虚拟内存模型,对于编程人员来说只用关心Java的内存模型就可以将一份源码在运行时转化为不同操作系统对应的机器码。(谨记,Java内存模型,我会在JVM的时候详解一下)

SDK : software development kit 软件开发包 函数库或者工具
JDK : java development kit 是面向开发人员的,java开发工具(Java的SDK)
jre : java runtime enviroment java运行环境,是面向应用程序使用者的(Java的运行时环境)

java命令: 

javac : 编译.java文件 变成.class文件
java : 运行.class文件
javadoc:生成java文档
jar : 把 .class 文件 变成jar包。
jar -cvf hello.jar HelloWorld.class

java的优点
1,简单性 : 面向对象变成,写代码变得非常简单。
2,跨平台 : 一次编译,到处运行。(jvm)
3,多线程 : 其他语言的多线程一般是系统级别的,java的多线程是语言级别的
线程 : 一个进程下 其他多个任务同时完成
进程 : 一个应用 运行 会在内存中开辟一块独立的内存空间
4,动态编译: 在一个项目中,如果需要修改一个java文件的话,那么就修改这一个文件就行了,其他的java文件不需要动

5,内存管理方案,gc:垃圾回收机制 : 指的是堆中的内存。

Java的类加载机制(.class加载到内存的过程)

参考文章:https://www.cnblogs.com/fingerboy/p/5456371.html

Java类加载机制也被称为双亲委托机制

首先说明三个类加载器:应用程序类加载器、扩展类加载器、启动类加载器。

类加载在程序执行之前的时候加载。

Java类可以被动态的加载到内存中,这也被称为Java的动态绑定或者运行时绑定。共享一个,根据限定名(包名+类名)来判断加载哪个。

启动类加载器Bootstrap ClassLoader(<JAVA_HOME>\lib目录):用来加载Java核心类库。共享一个

扩展类加载器Extendsion ClassLoader(<JAVA_HOME>\lib\ext目录下):你导入的外部jar包的类在这儿,所有类共享这一个

应用程序类加载器Application ClassLoader项目本地路径:自己写的类,这个类加载器是CLassLoader中的getSystemClassLoader()方法的返回值,所以也称为系统类加载器.一般情况下这就是系统默认的类加载器.

除此之外,我们还可以加入自己定义的类加载器,以满足特殊的需求,需要继承java.lang.ClassLoader类.

   Java面试系列01(Java类加载、双亲委托机制、Java优点)

获取应用程序类加载器

一个自己写的类  Test.class.getClassLoader();

获取扩展类加载器  Test.class.getClassLoader().getParent();

不能获取应用程序类加载器。

双亲委托机制:

双亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载请求(它的搜索范围内没有找到所需的类)时,才会交给子类加载器去尝试加载.

这样的好处是:java类随着它的类加载器一起具备了带有优先级的层次关系.这是十分必要的,比如java.langObject,它存放在\jre\lib\rt.jar中,它是所有java类的父类,因此无论哪个类加载都要加载这个类,最终所有的加载请求都汇总到顶层的启动类加载器中,因此Object类会由启动类加载器来加载,所以加载的都是同一个类,如果不使用双亲委派模型,由各个类加载器自行去加载的话,系统中就会出现不止一个Object类,应用程序就会全乱了.

  Class.forname():是一个静态方法,最常用的是Class.forname(String className);根据传入的类的全限定名返回一个Class对象.该方法在将Class文件加载到内存的同时,会执行类的初始化.

  如: Class.forName("com.wang.HelloWorld");

  ClassLoader.loadClass():这是一个实例方法,需要一个ClassLoader对象来调用该方法,该方法将Class文件加载到内存时,并不会执行类的初始化,直到这个类第一次使用时才进行初始化.该方法因为需要得到一个ClassLoader对象,所以可以根据需要指定使用哪个类加载器.

  如:ClassLoader cl=.......;cl.loadClass("com.wang.HelloWorld")

JVM:类加载、字节码验证(.class)、字节码转化为机器码

Java的全限定名  包名/子包名.类名

Java lang包不用显示导入,它是默认加载的。

点赞
收藏
评论区
推荐文章
待兔 待兔
2年前
一篇文章弄懂 Java 反射的使用
说到Java反射,必须先把Java的字节码搞明白了,也就是Class,大Class在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息,还不太明白Java的大Class的,可以先看一下之前的文章先想一个问题1.给我们一个类,我们如何使用?这还不简单,通过这个类,创建一个类的对象,再通过这个
Karen110 Karen110
2年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号“程序新视界”,好好系列的学习一下Java8的新特性。Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了。现在进入正题Java8的Lambda,首先看一下发音
Wesley13 Wesley13
2年前
JDK核心JAVA源码解析(1)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。首先我们从所有类的父类Object开始:1\.Object类(1)hashCode方法和equals方法
Wesley13 Wesley13
2年前
JDK核心JAVA源码解析(4)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对堆外内存与DirectBuffer进行深入分析,了解Java对于堆外内存处理的机制,为下一篇文件IO做好准备Java堆栈内存与堆外内
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
Java类加载机制的理解
算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解。要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机制和JVM字节码这样的核心特性。今天我将记录一下我在新的学习路程中对Java类加载机制的理解。1.类加载机制类加载是一个将类合并到正在运
Wesley13 Wesley13
2年前
JDK核心JAVA源码解析(7)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中集合类LinkedList进行分析,通过代码解释Java中的Failfast设计思想,以及LinkedList底层实现和与A