动态代理

代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。 代理分为静态代理以及动态代理,在学习完反射后,就可以完成动态代理。 动态对象 要想创建一个代理对象,需要使用Proxy类的newProxyInstance方…

lambda表达式

lambda表达式是一个匿名函数,我们可以把 Lambda 表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 但是在java中,是没有函数这个概念的。另外,依旧Java“万事万物皆对象”思想,java将lambda表达式做为一个接口(函数式接口,下面会说明)的实例。 首先,我们来感受下…

方法引用与构造器引用

方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式。所以方法引用也是函数式接口的一个实例。通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致。 语法格式:类…

lambda变量作用域

访问外围变量 lambda表达式可以捕获外围作用域中变量的值。 var str1 = "hello"; var str2 = "java"; testConsumer(str1, str-> System.out.println(str + " " + str2) ); 但在lambda表示式中,不能修改外围变量的值。下面的做法是不…

泛型概述

集合容器类在 设计阶段/声明阶段 不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属…

泛型类与泛型方法

泛型类 泛型类的声明 interface List 和 class GenTest<K,V> 其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。 常用T表示,是Type的缩写。 泛型类的实例化 一定要在类名后面指定类型参数的值(类型)。如: List<String> strList = new ArrayList<String>(); Iterat…

擦拭法

java的虚拟机是没有泛型类型对象的,所有的对象都属于普通类。 擦拭法 无论什么时候定义一个泛型,编译的时候都会自动的匹配一个相应的原始类。这个原始类名就是去掉类型参数后的泛型类型名。类型变量会被擦除,替换为限定类型,或Object(没有限定时)。 例如一个泛型类Pair如下: class Pair<T> { private T first; private T second; pub…

泛型限制与局限性

1.不能使用基本类型代替类型参数,因为基本数据类型么有继承自Object。 ArrayList<int> //错误 ArrayList<Integer> // ok 2.运行时查询只适用于原始类 if (order instanceof Order<Integer>) { // error } if (order instanceof Order<T&gt…

泛型与继承

类型变量的限定 有时,类或方法需要对类型变量加以约束。下面是一个典型的例子,我们要计算数组中的最小元素: class ArrayListUnit { public static <T> T t (T …args) { T item = args[0]; for (int i=1; i < args.length; i++) if (item.compareTo(args[i]…

通配符的使用

无限定通配符 使用类型通配符:? 比如:List<?>,Map<?,?> bool containsAll(Collection<?> c) List<?>是List、List等各种泛型List的父类。 list<?>可读,但不能写。 下面以可读特性举例2个: class Util { public static void show (A…