(3)AppClassLoader:ClassPath指定的所有jar或目录 。
12、异常机制Java体系中异常的组织分类如下图所示,所有异常类型的根类为 Throwable,具体包括两大类:Error 与 Exception 。其中,Error是指程序无法处理的错误,表示运行应用程序中较严重问题;Exception是指程序本身可以处理的错误,具体可分为运行时异常(派生于 RuntimeException 的异常)和其他异常 。
此外,从异常是否必须需要被处理的角度来看,异常又可分为不受检查异常和受检查异常两种情况:
(1)不受检查异常:派生于 Error 或 RuntimeException 的所有异常 。
(2)受检查异常:除去不受检查异常的所有异常 。
文章插图
finally子句,在对应的try子句执行的前提下,finally 子句总会被执行 。并且,finally子句 总是在诸如return、break、throw和continue等控制转移语句之前执行 。
文章插图
文章插图
文章插图
13、六大设计原则(1)单一职责原则:高内聚,一个类只做它该做的事情;
(2)接口隔离原则:接口小而专,避免大而全;
(3)依赖倒置原则:依赖抽象而非实现,面向接口编程;
(4)里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能;
(5)开闭原则:Open for Extension, Closed for Modification,例如AOP,代理模式,适配器模式就是其经典应用;
(6)迪米特法则:高内聚,低耦合;
14、代理模式
根据代理类的创建时机和创建方式的不同,我们可以将代理模式分为静态代理和动态代理两种形式,其中,在程序运行前就已经存在的编译好的代理类是为静态代理,在程序运行期间根据需要动态的创建代理类及其实例来完成具体的功能是为动态代理 。其中,代理对象的作用如下:
(1) 代理对象存在的价值主要用于拦截对真实业务对象的访问;
(2) 代理对象应该具有和目标对象(真实业务对象)相同的方法,即实现共同的接口或继承于同一个类;
(3) 代理对象应该是目标对象的增强,否则我们就没有必要使用代理了 。
文章插图
JDK 动态代理是动态代理模式的经典实现,主要包括三个角色对象:Subject (接口)、被代理的类以及InvocationHandler接口(一般持有被代理对象),例如:
(1)实现 InvocationHandler 接口
文章插图
(2)Proxy.newProxyInstance
文章插图
但是,JDK动态代理只能完成对接口的代理,而不能完成对类的代理,关键原因为:Java只允许单继承 。具体地,代理对象proxySubject的类型为“com.sun.proxy.$Proxy0”,这恰好印证了proxySubject对象是一个代理对象 。除此之外,我们还发现代理对象proxySubject所对应的类继承自java.lang.reflect.Proxy类,这也正是JDK动态代理机制无法实现对class的动态代理的原因 。
15、迭代器模式迭代器模式是与集合共生共死 。一般来说,我们实现一个容器,就需要同时提供这个容器的迭代器,使用迭代器的好处:封装容器内部的实现细节,对于不同的集合,可以提供统一的遍历方式,简化客户端的访问和获取容器内数据 。
文章插图
特别需要注意的是,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的 —— 遍历算法是与容器的内部细节紧密相关的 。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性,这被称为多态迭代 。
在 Java Collection FrameWork中,提供的具体迭代器角色是定义在容器角色中的内部类,这样便保护了容器的封装 。但是,同时容器也提供了遍历算法接口,并且你可以扩展自己的迭代器 。大家考虑一个问题,为什么一定要去实现 Iterable 这个接口呢? 为什么不直接实现 Iterator接口呢?
推荐阅读
- 网络编程之 Https 详细分析,超详细知识点
- 如果C++最强大,为什么它不及Java、Python流行?
- Nginx和Tomcat配合实现Java Web服务热部署
- Google 官方Java 编码规范
- JavaScript 里的奇葩知识
- 对于 JavaScript 中循环之间的技术差异概述
- 推荐5个爆款Java开源博客,是我目前用过最好用的博客系统
- 为什么Java类不支持多继承而接口可以?
- 如何利用Java代码操作索引库?
- Java8——异步编程