决定写一系列这样的文章吧,这一类的文章并不会探究到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类.
获取应用程序类加载器
一个自己写的类 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包不用显示导入,它是默认加载的。