黑马程序员——学习日志13高新技术(下)

------- android培训java培训、期待与您交流! ---------- 




1、泛型

没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可 以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,这样更安全;并且当从集 合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换。如果存储的 元素不是指定的类型,那么编译将会报错,把运行时的问题转换到了编译时期。

泛型的好处 :把运行时的异常转到了编译时期;避免了程序员强制类型的转换。

ArrayList<E>类定义和ArrayList<Integer>类引用中涉及如下术语:整个称为ArrayList<E>泛型类型;ArrayList<E>中的E称为类型变量或类型参数;整个ArrayList<Integer>称为参数化的类型;ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数;ArrayList<Integer>中的<>念着typeof ;ArrayList称为原始类型。

通配符:当我们定义类,方法(参数)不确定的时候,可以用?来表示。还可以定义上下边界,用extends和super。

只有引用类型才能作为泛型方法的实际参数。编译器不允许创建泛型变量的数组。即在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面语句有错误:Vector<Integer> vectorList[] = newVector<Integer>[10];

普通方法、构造方法和静态方法中都可以使用泛型。也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch语句中。

当一个变量被声明为泛型时,只能被实例变量、方法和内部类调用,而不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。

2、类加载器

Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 。类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。

AppClassLoader类加载器的父级别类加载器是ExtClassLoader类加载器,ExtClassLoader类加载器的父级别类加载器是BootStrap类加载器。 在实例化每个类加载器对象时,需要为其指定一个父级类加载器对象或者默认采用系统类加载器为其父级类加载。

委托机制:首先当前线程的类加载器去加载线程中的第一个类。 如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B。还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。每个类加载器加载类时,又先委托给其上级类加载器。当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那有多个儿子,找哪一个呢?

每个ClassLoader本身只能分别加载特定位置和目录中的类,但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。类加载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类装载器去进行真正的加载。当回退到最初的类装载器时,如果它自己也不能完成类的装加载,那就会告ClassNotFoundException异常。

有一道面试题,能不能自己写个类叫java.lang.System?答案是不能,即使写了也不会被类加载器加载。为了不让我们写System类,类加载机制采用委托机制,这样,可以保证父级类加载器优先,也就是总是使用父级类加载器能找到的类,结果就是总是使用Java系统自身提供的System类,而不会使用我们自己所写的System类。

3、代理与AOP

为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能可以使用代理。如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类、还是代理类,这样以后很容易切换,譬如,想要日志功能时就配置代理类,否则配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易。

AOP: 交叉业务的编程问题即为面向方面的编程(Aspectoriented program ,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的。使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。

JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类;JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理;CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。

 

 

 





------- android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值