java SE基础进阶知识点整理

java变量存储位置:
静态变量:位于堆中
实例变量:作为对象中的一部分,存储在堆中
静态变量在实例化前就已经加载进堆中,实例变量需要在实例化才能加载进堆的对象中
栈内存中存放局部变量,堆内存用来存放对象
java虚拟机首先加载类,然后执行内部的静态块,再去调用main方法。
方法是加载到栈当中进行运行
类和方法是存储在方法区中,编译时将方法放在栈中运行。
方法中的局部变量在方法执行完后,会从栈中消失。
实例成员方法是存储在方法区中,堆的对象中的成员方法名存储的成员方法在方法区中的引用地址
一.static
static 修饰 类会优先进行加载,随着类的加载而加载
static 是静态的意思,可以修饰成员变量和成员方法;
static 修饰成员变量是表示该成员变量在内存当中只能存储一份,该变量可以被共享访问,修改。
静态成员变量有static修饰属于类,加载一次,可以被共享访问。
格式:类名.静态成员变量
实列成员变量无static修饰属于对象。
静态成员方法(有static修饰,属于类,对象),可以用类名进行访问 存储在方法区
实例成员方法(无static修饰,属于对象),只能用对象进行访问
【使用场景】表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明为实例方法
如果该方法定义以执行一个通用功能的方法为目的,则可以申请为静态方法。
static规则:1.静态方法只能访问静态成员,不能“直接”访问实例成员(可以间接访问 通过创建对象,再对象名.成员来触发)
2.实例方法可以访问静态成员,也能够访问实例成员
3.静态方法中不能出现this关键字(静态方法是属于类,对象 是共享的,不能指明是具体属于哪个对象的)
工具类:1.类中都是一些静态方法,每个方法都是以完成一个共用功能的目的,这个类是给系统开发人员使用的。
2.好处:调用方便,调高用性
工具类的方法为什么不用实例方法做:实例方法需要创建对象,此时用对象只是为了调用方法,只会浪费内存。
工具类的定义要求:由于工具类都直接用类名访问即可,因此,工具类不需要创建对象,建议将工具类的构造器进行私有(相对于无法初始化这个类的实例,就无法创建这个类对象)

代码块概述:代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法外。
在java类中,使用{}括起来的代码称为代码块
代码块分为:
	静态代码块
			格式:static{}
			特点:需要通过static修饰,随着类的加载而加载,并且自动触发,只执行一次
			使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用
	构造代码块
			格式:{}
			特点:每次创建对象时,调用构造器执行时,都会执行该代码块中的代码,并且在构造器前执行
			使用场景:初始化实例资源 
单例模式:可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象
		  例如任务管理器对象我们只需要一个就可以解决,这样可以节省内存空间
		  1.饿汉单例模式
			在用类对象的时候,对象已经提前为你创建好了
			设计模式:定义一个类,并将构造器私有
					  定义一个静态变量存储一个对象
		  2.懒汉单例设计模式:在真正需要该对象的时候,才去创建一个对象(延迟加载对象)
			设计步骤:定义一个类,将构造器私有

二.继承:java中提供一个关键字extends,用这个关键字,我们可以让一个类和另外一个类建立起父子关系。
作用:当子类继承父类后,就可以直接使用父类公共的属性和方法
好处:使用继承可以提高代码的复用性
设计规范:子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的属性和方法应该定义在子类自己里面
创建子类对象时,在堆中内存中 总的会有两个空间一个(一个父类空间(super),一个子类空间(this)),这两个空间整体属于同一个对象
父类的属性和方法会放在父类空间中,子类的属性和方法会放在子类空间中。

	  特点:1.子类可以继承父类的公有属性和方法,但是不能继承父类的构造器
				父类构造器用于初始化父类对象
				
			2.java是单继承模式;一个类只能继承一个父类(不支持多态继承的原因:可能会出现冲突)
			3.java不支持多继承,但是支持多层继承
			4.java中所有的类都是object类的子类(java所有类,都是直接继承了object类,要么默认继承object类,要么间接继承object类)
			在子类方法中访问成员(成员变量,成员方法):就近原则
														先在子类范围查找
														然后在子类成员中查找
														然后父类范围查找,父类范围查找不到报错。
			再子父类中出现重名的成员,会优先访问子类中的成员。
			  可以通过super关键字,指定访问父类的成员 
			  this关键字是指定访问当前对象中的成员
			  
	  方法重写(申明不变,重新实现):子类中出现和父类一样的方法声明,就称子类的这个方法是重写的方法。
									  重写的方法名称和形参列表 必须与被重写 的方法名称和参数列表一致
									  私有方法不能被重写
									  子类不能重写父类的静态方法
									  
	  子类继承父类构造器的特点:子类的全部构造器都会先访问父类的无参构造器再执行自己
						  原因:子类在初始化的时候,有可能会使用到父类的数据,如果父类没有完成初始化,子类将无法使用父类的数据
								子类初始化之前,一定要调用父类构造器先完成父类数据的初始化
		  怎么调用父类构造器的:子类构造器的第一行语句默认都是:super() ,不写默认存在。
								调用父类的有参构造器,初始化继承自父类的数据
		  面试常考:在子类构造器可以同时写super()语句和this()?
					 不需要,因为每个子类构造器都是默认调用父类无参数构造器,super()调用了一次父类无参数构造器,
					 this()调用本类中兄弟构造器,兄弟构造器的第一行同时默认会调用父类无参数构造器。
					 
导包:同一个包下的类可以直接访问,不同包下的类需要导包后才能使用。
	  如果这个类中使用不同包下的相同的类名,此时默认只能导入一个包,另一个类需要使用全名访问。

权限修饰符:是用来控制一个成员能被访问的范围;(范围从小到大 private<缺省<protected<public

			修饰符		同一个类中		同一个包中其他类		不同包下的子类		不同包下的无关类
			private		√				
			缺省		√				√
			protected	√				√						√
			public 		√				√						√					√
			
			自己定义成员(成员,成员变量,构造器)一搬需要满足以下条件:成员变量一般私有
																		方法一般公开
																		如果该成员只希望本类访问,使用privaye修饰
																		如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰
					
final的作用:final关键字是最终的意思,可以修饰(类,方法,变量)
			 修饰类:表明该类是最终类,不能被继承
			 修饰方法:表明该方法是最终方法,不能被重写
			 修饰变量:表明该变量是最终变量,第一次赋值后,不能再次被赋值(有且仅能赋值一次)
	   注意:final修饰的变量是基本类型:那么变量存储的数据值不能发生改变
			 final修饰的变量是引用类型:那么变量存储的地址值不能发生变化,但是地址指向的对象内容是可以发生变化的。
			 
常量:
	常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变
	常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时提高可读性
	执行原理:在编译阶段会进行“宏替换”,把使用常量的地方全部替换成真实的字面量
			  这样做的好处是让使用常量的程序的执行性能与直接使用字面量是一样;
			  
抽象类:
		在java中abstract是抽象的意思,可以修饰类,成员方法)
		abstract修饰类,这个类就是抽象类;修饰方法,这个就是抽想方法
		 作为父类,用来被继承,约定子类让子类必须完成某个功能。
		注意:抽象方法只有方法签名,不能声明方法体
			  一个类中的方法声明为抽象方法,这个类也必须声明成抽象类
			  一个类如果继承了抽象类,这个类必须重写抽象类的全部抽象方法。
			  类有的东西,抽象类都有的
			  抽象类可以没有抽象方法,有抽象方法的一定就是抽象类。
			  一个类继承了抽象类必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类
			  不能abstract修饰变量,代码块,构造器。
			  最重要的特征:得到了抽象方法,失去了创建对象的能力(有得有失)java是一个非常严谨的代码,抽象类中抽象方法没有方法体,不能运行。
							抽象类就是不能实例化,创建new 对象 本身就是一个实例化的过程,所有java直接就让抽象类是不能创建对象。
final和abstract的关系:
					  互斥关系
					  final修饰的类是不能被继承的,abstract修饰的抽象类是必须被继承
					  final修饰的方法是不能被重写的,abstract修饰的抽象方法是必须被重写
模板方法模式实现步骤:把功能定义成一个所谓的模板方法,放在抽象类中,模板方法只定义通用且确定的代码
					  模板方法中不能决定的功能定义成抽象方法让具体子类去实现
				作用:提高了代码的复用性
					  模板方法已经定义了通用结构,模板方法中不能确定的部分定义为抽象方法,让子类具体去实现
					  因此使用者只需要关心实现自己的功能即可 

多态:同类型的对象,执行同一个行为,会有不同的表现特征
	  常见的形式:父类类型 对象名=new 子类构造器;
				  接口     对象名=new 实现类构造器;
	  可以这样创建对象的原因:子类是继承于父类的,子类类型的范围是在父类类型的范围内
	  访问成员变量的特点:
						方法调用时:编译看左边,运行看右边(定义父类变量中存储子类对象,方法调用的子类中子类和父类通有功能)
						变量调用时:编译看左边,运行也看左边
	   优势:在多态形态下,右边对象可以实现解耦合,便于扩展和维护。
			eg Animal a=new Dog();
			   a.run();//后续业务行为随对象而变,后续代码无需修改
			 定义方法的时候,使用父类型作为参数,该方法就可以接收父类的一切子类对象,体现出多态的扩展型和便利
	  多态下不能访问子类独有功能,只能访问子类和父类通有功能
	  可以通过类型转换解决这个弊端:自动类型转换(从子到父):子类对象赋值给父类类型的变量进行指向。
									强制类型转换:子类 对象变量=(子类)父类类型的变量
									作用:可以转换成真正的子类类型,从而调用子类独有功能。
	 instanceof:用来判断变量的真实类型
内部类:内部类就是定义再一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)
		作用:内部类可以提高更好的封装性,内部类本身就是可以用private修饰,封装性可以做更多控制
		
匿名类  :简化代码
		特点:匿名内部类是一个没有名字的内部类
			  匿名内部类写出来就会产生一个匿名内部类的对象
			  匿名内部类的对象类型相当于是当前new的那个类型的子类类型
			  
API:
	Object类中的toString()方法:默认返回当前对象在堆内存中的地址信息,类的全限名@内存地址
				toString()用处:让子类重这个方法,输出该地址上的内容信息(重写后的内容信息均为字符串类型)
								每一个引用类型在输出时都是默认调用该类下的toString()方法
				
				equals()方法:比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false;
							  (String类中对继承与object类的equals()方法进行重写,String中的equals()方法比较字符串的内容是否一样)
	StringBuider:是一个可变字符串类,我们可以把它看成是一个对象容器,拼接字符串性能好,代码优雅,提高字符串的操作效率。 
				 定义字符串使用String
				 拼接,修改字符串使用StringBuilder
	
	Math类:包括执行基本数字运算的方法,Math类中没有提供公开的构造器
			类的成员是静态的,通过类名直接去访问就可以
	
	BigDecimal:用于解决浮点型运算精度失真问题
	
	包装类:8种基本数据类型对应的引用类型
			基本数据类型		引用数据类型
			byte				Byte
			short 				Short
			int					Integer
			long				Long
			char				Character
			float				Float
			double				Double
			boolean				Boolean
			
			提供包装类原因:java为实现一起皆对象,为8种基本数据类型提供了对应的引用类型
							集合和泛型其实也只能支持包装类型,不支持基本数据类型
					 常用功能:可以把字符串类型的数值转换为真实的数据类型(经常用)
								要转换的数据类型  数据类型 变量名=数据类型.valueOf(字符串对象)

	正则表达式:String类的哪个方法与正则表达式进行匹配
				public boolean matches(String regex)
				判断是否匹配,匹配返回true,不匹配返回false

	Arrays类常用的api:Arrays是一个工具类,成员变量和成员方法均是static修饰的,通过类名.成员 来访问。
						方法名							说明
						public static String toString() 		对于数组进行排序
						public static void sort()				对数组进行默认升序排序
						public static <T> void sort(类型[]a,new Comparator<数组类型>(){}					
						自定义排序规则:设置Comparator接口对应的比较器对象,来制定比较规制
						如果认为左边 大于 右边数据 返回正整数
						如果认为左边 小于 右边数据 返回负整数
						如果认为左边数据 等于 右边数据 返回0;
						(return 参数左边-参数右边 升序
						  return 参数右边-参数左边 降序)

	Lambda:JDK8以后的新语法 
			作用:简化匿名内部类的代码写法
			Lambda只能简化接口中一个抽象方法的匿名内部类形式
			格式:(匿名内部类被重写方法的形参列表)->{
			被重写方法的方法体代码。
			};
			->是语法形式,无实际含义。
	
集合:
	 集合和数组都是容器;
	 集合是java中存储对象的一种容器
	 注意:集合只能存储引用类型,如果要存储基本数据类型,可以选择用包装类。
	 包括两部分:1.Collection(单列):每一个元素只包含一个值
										List(接口)系列集合特点:添加的元素是有序,可重复,有索引
													List实现类:ArrayList、LinkedList:有序,可重复,有索引;
										Set系列集合:添加的元素是无序的,不重复,无索引
													HashSet:无序,不重复
				 2.Map(双列):每一个元素包含两个值(健值对)
	 
	 集合都是支持泛型:可以在编译阶段约束集合的数据类型
					   Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用
	 
	 迭代器:
			遍历就是一个一个的把容器中的元素访问一遍
			迭代器在java中就是iterator,迭代器是集合的专用遍历方法。
			方法 						说明
			Interator<E>interator() 	返回集合的迭代器对象,该迭代器对象默认指向当前集合的0索引
			
			boolean hasNext()			询问当前位置是否有元素存在,存在返回true,没有返回false
			E next()					获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。  
			
			增强的for循环:即可以遍历集合也可以遍历数组
							在JDK5之后出现的,其内部原理是一个iterator迭代器,遍历集合相当于迭代器的简化写法
						   实现iterable接口的类才可以实现迭代器和for增强循环,Collection接口已经实现iterable接口
					 格式:for(元素数据类型 变量名:数组或者集合)//遍历是从当前集合或者数组的0开始索引,将获取索引位置上的元素值拷贝给变量
					 {
					 }
	list集合特有方法:List集合因为支持索引,所以多了很多索引操作的独有api,其他Collection的功能List也继承了
	List的实现类的底层原理:ArrayList:底层是基于数组实现的,根据查询元素快,增删相对慢
									   第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组
									   插入位置与数组长度相等需要进行扩容(每次扩容1.5倍)
									   {
									      插入的实现过程:首先 size往后移一位,同时从size的位置开始从往前遍历,将前一位的地址赋值给后一位。
	                        LinkList:底层是基于双链表实现的,查询元素慢,增删首尾元素是非常快的
							
							哪些遍历可能会存在问题:迭代器遍历集合且直接用集合删除元素的时候可能会出现
													增强for循环遍历集合且直接用集合删除元素的时候会出现
							哪种遍历且删除元素不处问题:迭代器遍历集合但是用迭代器自己的删除方法操作可以解决
														使用for循环遍历并删除不会存在这个问题1.从集合最后面开始遍历循环,与集合自动补位方向一致 2.从集合前面遍历循环 在每次判断删除一个元素后 遍历循环索引后退一位,保证不会漏删元素 
	
	Set系列集合特点:无序,不重复,无索引
		   实现类特点:HashSet:无序,不重复,无索引
					   LinkedHashSet:有序,不重复,无索引
					   TreeSet:排序,不重复,无索引
			Set集合的功能基本上与Collection的api一致
	Set的实现类底层原理:HashSet:底层是基于哈希表实现的。(数组+链表+红黑树的结合体)
								 哈希值:是JDK根据对象的地址,按照某种规则算出来的int类型的数值
								 Object类的API:public int hashCode(); 返回对象的哈希值
								 创建一个默认长度16的数组,默认加载因子为0.75的数组,数组名为table
								 当数组存满到16*0.75=12时,就自动扩容,每次扩容为原先的两倍 
								 根据元素的哈希值根据数组的长度求余计算出应存入的位置(哈希值对长度求余,余数就是要存入数组的下标)
								 判断当前位置是否为null,如果null直接存入
								 如果位置不为null,表示有元素,则调用equals()方法比较
								 如果一样,则不存,如果不一样,则存入数组(以链表的形式,挂在该元素的下面)
								 哈希表是一种对于增删改数据性能都比较完美的结构
								 
						LinkedHashSet:底层数据结构依然是哈希表,使用双链表记录添加顺序(有序的原因)。
									
						TreeSet:不重复,无索引,可排序
								可排序:按照元素的大小默认升序(有小有大)排序
								TreeSet集合底层是基于红黑树的数据结构实现排序,增删改查性能都较好
								默认的规则:对于数值类型:Integer,Double,默认按照大小进行升序排序
											对于字符串类型:默认按照首字符的编号升序排序
											对于自定义类型,TreeSet无法直接进行排序
  各集合在什么场景下使用:
  1.如果希望元素可以重复,又有索引,索引查询要快
		用ArrayList集合,基于数组的(用的最多)
  2.如果希望元素可以重复,又有索引,增删首尾操作快
  
								 
								 
	

数据结构:数据结构是计算机底层存储,组织数据的方法,是指数据相互之间是以说明方法排列在一起的
		 栈:后进先出,先进后出
		 队列:先进先出,后进后出
		 数据:内存一块连续区域
			   查询速度快,查询数据通过地址值和索引定义(查索引值快),查询任意数据耗时相同
			   删除效率低:要将原始数据删除,同时后面每一个数据后移。
			   添加效率低:添加位置后的每一数据后移,再添加元素
		 链表:链表中的元素是在内存中不连续存储,每一个元素节点包含数据值和下一个元素的地址。
			  链表中的元素是游离存储的,每一个元素节点包含数据值和下一个元素的地址。
			  链表查询慢,无论查询哪个数据都要从头开始找
			  链表增删相对较快(查找需要修改元素时还是比较慢需要从头开始找,只是在增删元素的时刻快(修改节点下一个元素地址即可))
			  种类:单向链表
					双向链表
		二叉树:每一个节点包含父节点地址,值,左节点地址,右节点地址
		平衡二叉树:在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。
					要求:任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树
					在添加元素后导致不平衡的策略:进行左旋或者右旋保证平衡
		红黑树:红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构
				每一个节点可以是红或者黑,红黑树不是通过高度平衡的,它的平衡通过红黑规则进行实现的
				红黑规则:每一个节点或是红色的,或者是黑色的,根节点必须是黑色的
						  如果一个节点没有子节点或者父节点,则该节点为Nil,这些Nil视为叶节点,叶节点是黑色的。
						  如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红节点相连的情况)
						  对于每一个节点,从该节点到其所有后代节点的简单路径上,均包含相同数目的黑节点。

泛型:可以在编译阶段约束操作的数据类型,并进行检查
	 格式:泛型只支持引用数据类型
	 集合体系的全部接口和实现类都是支持泛型使用的	
	 好处:统一数据类型
	 定义类的同时定义了泛型的类就是泛型类
	 泛型类的格式:修饰符 class 类名<泛型变量>()
				  范例:public class MyArrayList<T>
				  此处泛型变量T可以随便写为任意标识,常见的如E,T,K,V等;
				  编译阶段可以指定数据类型,类似于集合的作用。(使类更具有通用性)
	 泛型类的原理:把出现泛型变量的地方全部替换成传输的真实数据类型 
	
	 泛型接口:使用了泛型定义的接口就是泛型接口
	 泛型接口的格式:修饰符 interface 接口名称<泛型变量>{}
					 范例:public interface Data<E>{}
					 作用:泛型接口可以让实现类选择当前功能需要操作那种类型的数据
	
	通配符:?可以在”使用泛型“的时候代表一切类型
			E T K V是在定义泛型时使用的
			
			泛型的上下限:
			 ? extend 父类数据类型 :必须时父类数据类型的子类,泛型上限
			 ? super  数据类型:必须是数据类型或者其父类    泛型下限

可变参数:
		可变参数用在形参中可以接受多个数据
		可变形参的格式:数据类型...参数名称
	作用:
		传输参数非常灵活,方便。可以不传参数,可以传输1个或者多个,也可以传输一个数组
		可变参数在方法内部本质上就是一个数组
	注意事项:
		1、一个形参列表中只能有一个可变参数,可变参数必须放在形参列表的最后面

Collections集合工具类:java.util.Collections
				 作用:Collections并不属于集合,是用来操作集合的工具类.
			  排序API:只能对于List集合的排序

Map集合(接口):是一种双列集合,每一个元素包含两个数据
				 Map集合的每一个元素的格式:key=value(健值对元素)
				 Map集合也被称为”健值对集合“
		   特点:Map集合的Map集合的健是无序,不重复的,值是不做要求,可以重复
				 Map集合后面的重复的健会覆盖前面重复健的值
			
   Map实现类特点:
				HashMap:元素是无序,不重复,无索引,值不做要求
				TreeMap:元素是按照排序,不重复,无索引的,值不做要求
				LinkedHashMap:元素按照健有序的,不重复,无索引,值不做要求
  
  Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
  
  Map集合的遍历方式一:键遍历值
					   先获取Map集合的全部键的Set集合
					   遍历键的Set集合,然后通过键提取对应值
 Map集合的遍历方式二:键值对流程
					  先把Map集合转化为Set集合,Set集合中每一个元素都是键值对实体类型了
					  通过Set集合,然后提取键以及提取值
  HashMap:HashMap是Map里面一个实现类,特点由键决定的:无序,不重复,无索引
		   没有需要额外学习的特有方法,直接使用HashMap底层原理是一模一样的,都是哈希表结构
		   HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap包含两个值而已
		   实际上,Set系列集合的底层就是Map实现的,只是Set集合重点元素只要键数据,不要值数据而已;
  
  LinkedHashMap:由键决定 有序,不重复,无索引
				有序指的是保证存储和取出的元素顺序一致
				原理:底层数据结构是依然哈希表,只是每一个键值对元素又额外的多出一个双链表来记录存储顺序
  
  TreeMap:由键决定特性:不重复,无索引,可排序
		  可排序:按照键数据的大小默认升序,只能对键排序
		  TreeMap集合是一定需要排序的,可以默认升序,也可以将键按照指定的规则进行排序
  
  异常:异常是编程在”编译“或者”执行“的过程中可能出现的问题,注意:语法错误不算在异常体系中
        为什么需要异常:异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止
				        研究异常并且避免异常,然后提前处理异常,体现的程序的安全,健壮性。
				  
	  异常体系:Throwable->{1.Error 系统级别异常 ,JVM退出,代码无法控制
							2.Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题
								RuntimeException及其子类:运行时异常,编译阶段不会报错(空指针异常,数组索引越界异常)
								除RuntimeException之外所有的异常:编译时异常,编译期必须处理,否则程序无法通过编译(日期格式化异常)
				学习异常的目的:避免异常的出现,同时处理可能出现的异常,让代码更加稳健		
  运行时异常:直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能会出现错误
			  一搬是程序员业务没有考虑好或者编程逻辑不严谨引起的程序错误
  
  编译时异常的目的:是担心程序员技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错。
  编译时异常的处理形式有三种:
							 1.出现异常直接抛出去给调用者,调用者继续抛出去
							 2.出现异常自己捕获处理,不麻烦别人
			  异常处理方法一:throws Exception用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者
			  
			  异常处理方法二:try... catch... 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理(谁出现异常谁处理)
							  发生异常的方法自己独立完成异常的处理,程序可以执行下去。
			  
			  异常处理方法三:方法直接将异常抛给调用者,再由调用者来处理这个异常;(这样可以知道是什么异常)
			  
			  throw:在方法内部直接创建一个异常对象,并在此点抛出
			  throws:用在方法申明上,抛出方法内部的异常

AJAX:异步的JavaScript和XML;
AJAV作用:1.与服务器进行数据交换,通过AJAX可以给服务器发送请求,并获取服务器响应的数据
				使用了AJAX和服务器进行通信,就可以使用html+ajax来替换JSP页面了
		  2.异步交互:可以在不重新加载整个页面的情况下,与服务器进行数据交换并更新网页的技术。
		  
		  同步:当客户端请求服务器端时,需要等待服务器处理请求后,响应客户端,客户端才能继续访问
		  异步:当客户端请求服务器端时,服务器会去处理这个请求,同时客户端也还能执行其他的操作,不需要一直等待服务器端响应客户端。

Axios:异步框架:对原生的AJAX进行封装,简化书写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值