其实就是javaSE必须要掌握的知识点,见目录
三个概念:
JDK: java development kit(java开发工具)
JRE: java runtime environment(java运行时环境)
JVM: java Virtual Machine(java虚拟机)
a. JDK:
JDK就是我们开发人员使用的开发工具,它里面包含了JRE、JVM和基础类库。所以编程的话只需要安装JDK,配置环境变量,path路径就可以了。
b. JRE:
JRE是运行环境,如果说我们写完的java程序需要部署到客户的服务器上运行,当然客户是不需要开发的,那我们仅安装JRE就可以,当然JRE里包含JVM,运行环境嘛,肯定要运行到JVM虚拟机上。JRE的lib目录中放了一些java类库的class文件。
c. JVM:
JVM:java虚拟机,JVM上会运行java编译的class文件,当然它在运行解释class时会调用类库还完成运行,也是因为JVM,我们的java才能完美的跨平台,因为它让java程序只需要在JVM上运行而不是操作系统平台本身。
答:为了在命令行窗口下编译和运行Java程序!
为什么说在命令行窗口下呢,因为比如近几年喜欢用的IDEA,我们可以不配置环境变量,仅仅在IDEA的settings里面配置好jdk的安装目录,就可以运行使用了。但是如果不配置环境变量,我们在命令行窗口下是无法编译运行我们写好的java源文件(不在编译程序的文件夹下),为什么呢?
开发人员编写的java文件是无法被计算机识别的,需要JDK中的编译程序javac.exe来进行编译,那么除非我们将我们的源码放到编译程序所在目录下,否则不配置环境变量的情况下,系统根本无法找到我们的源码位置,所以编译程序也就无法完成编译。javac是不是很熟悉,开始学java的时候,老师教我们的判断环境变量部署是否成功,就可以输入javac,如果配置错误,会出现以下:
这个就是经典的jdk安装成功但路径配置错误。
经过以上解释,我们配置环境变量的原因就是能够让我们在任何文件夹下都能用执行java命令,包括编译程序以及其他可执行文件。
以前配置变量时,一个要配置PATH变量(指定java位置),另一个要配置classpath环境变量。那么这个变量又是来做什么的呢?跟PATH变量有何区别?
在PATH变量配置时,曾说过我们编写完源码,java要将它们编译成class文件,再之后就要执行程序了。也就是说需要把class文件读到JVM中,并转换为计算机能识别的语言来执行。而classpath变量,看名字也知道,是class文件的路径变量,我们需要指定一个路径,告诉JVM去这个路径下找class文件执行,如下图:
变量值前面的 “.” 就是告诉虚拟机要在当前路径下搜索,那通常也会把JDKbin文件下的dt.jar和tools.jar也放到classpath里面。dt.jar是环境运行的类库,tools.jar是工具类库,这两个类库支撑大部分java程序的运行。
但是很多人会发现,我们现在一般不会去配置classpath这个变量,这是因为JDK1.5版本之后,JRE可以自动检索当前文件夹下的class文件,并且自动加载上述两个工具类库,因此我们再也不需要配置classpath变量了。
在配置变量前,我们都会设置**%JAVA_HOME%变量**,设置值如下:
说白了它就是引用jdk的地址,可以把它想象一个变量名,变量值是JDK的安装路径。当然,在path里直接写到bin文件下也是可以的,但是我们推荐使用%JAVA_HOME%的原因,其一是jdk版本迭代是,只需要修改%JAVA_HOME%值即可,当然这只是很小的原因,毕竟也不会经常迭代,重要的是像一些插件或者服务器或者IDEA,都会通过这个变量名去找JDK的安装路径,为了减少不必要的麻烦,还是动动小手指添加一个%JAVA_HOME%吧。
面向对象语言类和类关系的一种,继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
简单来说就是为了避免重复代码,在父类定义一些方法,它的每个孩子都必须要继承的,但是子类自己的方法体内可以不同。
封装,就是保护自己内部代码,将一些接口的实现细节包装隐藏。
举个例子,定义一个Person类,两个属性用private修饰,代表只有本类能访问,隐藏两个属性,但是对外提供获取和修改两个属性的方法。
多态就是,同一个接口,使用不同实例来执行不同的操作。
存在的三个条件:
import java.io.*;
public class aaa
{
public void method1(String param) throws Exception {
// 方法体
}
public void method2(String param) {
// 方法体
throw new RemoteException();
}
}
抽象类的特点:
接口特点:
6. interface修饰类
7. 不能被实例化
8. 可以多实现
9. 接口内方法都是抽象方法,省略了public abstract,在java8后,接口里可以定义静态方法,静态方法有方法体。
JVM在运行时会在内存中开辟一片内存区域
JVM内存:
1. 寄存器
2. 本地方法区
3. 方法区
4. 栈内存
5. 堆内存。
栈内存: 栈内存存储的都是局部变量,一般来说先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,一旦离开变量作用域,就会被释放。
堆内存: 存储的是对象,凡是new建立的都是在堆中,堆中存放的都是实体(对象)。实体用于封装数据,对象内的成员变量也存储在堆中。如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是会被Java的垃圾回收机制不定时的回收。
有时候需要对一个对象进行处理,但是又不想改变原有的对象,那么就要将对象拷贝成一个新的对象并操作新对象。
方法:
实现Cloneable接口,重写clone方法
实现Serializable接口,序列化和反序列化,实现深克隆。
BeanUtils、apache和Spring都提供bean工具,都是浅克隆。
深克隆,既克隆基本类型变量,又克隆引用类型变量,浅克隆只克隆基本类型变量。
Object、String、Math、Date
常用类博客:https://blog.csdn.net/sugar_no1/article/details/88016599
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
java中所有的异常都是Exception的子类,而Exception和Error都继承了Throwable类。
Exception区别于Error,Error是脱离人为控制的存在,在代码中通常被忽略,比如JVM 内存溢出,Error是运行时出现的错误,java通常不捕获错误。
异常用 try catch来捕获,
多重捕获:
try{
// 程序代码
}catch(IOException e1){
// 程序代码
}catch(NullPointerException e2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
如果要写一个检查性异常类,需要继承 Exception 类。如果要写一个运行时异常类,需要继承 RuntimeException 类。
class MyException extends Exception{
// 属性
// 方法体
}
java的集合框架主要包括两种类型的容器,Collection 和 Map。Collection来存储元素集合,Map来存储键值对。简单来说集合就是长度可变的容器,用来存储对象的。
接口部分:
接口实现类部分:
集合里每个实现类底层都有自己实现的数据结构,这里简单介绍几种数据结构:
先进后出,入口出口在同一侧,(像矿泉水瓶,只有一个口),入栈数据:123,出栈数据:321
二叉树的两种结构,一种是链式结构,一种就是顺序结构,普通二叉树其实是不适合用数组来存储数据,因为会造成大量空间的浪费,但完全二叉树似乎更合适于顺序结构存储,我们通常把堆(完全二叉树) 使用顺序数组来存储。
https://blog.csdn.net/weixin_45350120/article/details/108614291
数组地址是连续的,长度固定,通过数组的首地址找到对应的数组,然后用索引来查找数组中的元素,但是如果想对数组进行增/删操作,必须创建一个新的数组,把原来的数据复制过来,形成新数组后,销毁原数组,所以查询快,增删慢
不同于栈,队列是先进先出,入口出口分布在集合的两侧,存储数据:123,取出数据:123,(类似排队安检)
跟数组相反,链表中的地址不连续,每次查询元素都需要从头开始查询,但是增删对整体结构无影响,所以查询慢,增删快
链表中每个元素称为一个节点,节点包括自己的地址、数据本身、下一个节点的地址
树详解https://zhuanlan.zhihu.com/p/74141967
感兴趣的可以看看
图简介https://wenku.baidu.com/view/028083711db91a37f111f18583d049649b660eb1.html
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
哈希表原理详解https://blog.csdn.net/yyyljw/article/details/80903391
注意:
内存中的堆栈和数据结构堆栈不是一个概念,内存里的堆栈是真实存在的,数据结构是抽象的
数据结构原理:https://www.cnblogs.com/javastack/p/13474377.html
下一博客:
java基础知识点总结(二)泛型、IO流、多线程