一、接口。
1.概念:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方由不同的类实现,而这些实现可以具有不同的行为。若以一种方便理解的角度来看,可以认为接口是一种特殊的类,里面全部由全局常量和公共的抽象方法所组成。我们也可以直接把接口理解为100%的抽象类,即接口中的方法必须全部是抽象方法。
2.基本特点:
(1)接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。
(2)一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者对move()方法进行重写,进行实现)。
(3)因为Java不支持多继承,所以可以通过实现接口来弥补这个局限。
(4)接口中存在的变量一定是final,public,static的。
3.重要的细节:
(1)不能直接去实例化一个接口,因为接口中的方法都是抽象的。但我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。
(2)一个类可以实现不止一个接口。
(3)一个接口可以继承于另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。
(4)一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。
二、泛型
1.概念:泛型,即“参数化类型”。顾名思义,就是将类型由原来的具体的类型参数化,此时类型也定义成参数形式,然后在使用/调用时传入具体的类型。泛型在逻辑上可以看成是多个不同的类型,实际上都是相同的基本类型。
2.使用:在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。下面依次介绍一下这三种类型的使用规则:
(1)泛型类:泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。定义的泛型类,在使用泛型的时候如果传入泛型实参,则会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用。如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。
(2)泛型接口:泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。
(3)泛型方法:泛型方法需要在调用方法的时候指明泛型的具体类型。
泛型方法也能使方法独立于类而产生变化,以下是基本的原则:
无论何时,如果你能做到,你就该尽量使用泛型方法。也就是说,如果使用泛型方法将整个类泛型化,那么就应该使用泛型方法。另外对于一个static的方法而已,无法访问泛型类型的参数。所以如果static方法要使用泛型能力,就必须使其成为泛型方法。
3.泛型的通配符分为三种,上界通配符、下界通配符和无界通配符:
(1) extends T> 上界通配符
上界通配符顾名思义, extends T>表示的是类型的上界(包含自身),因此通配的参数化类型可能是T或T的子类。
正因为无法确定具体的类型是什么,add方法受限(可以添加null,因为null表示任何类型),但可以从列表中获取元素后赋值给父类型。这就是所谓的上限通配符,使用关键字extends来实现,实例化时,指定类型实参只能是extends后类型的子类或其本身。这样就确定集合中元素的类型,虽然不确定具体的类型,但最起码知道其父类。然后进行其他操作。
(2) super T> 下界通配符
下界通配符 super T>表示的是参数化类型是T的超类型(包含自身),层层至上,直至Object。编译器无从判断get()返回的对象的类型是什么,因此get()方法受限。但是可以进行add()方法,add()方法可以添加T类型和T类型的子类型,这就是所谓的下限通配符,使用关键字super来实现,实例化时,指定类型实参只能是extends后类型的子类或其本身。
(3)> 无界通配符
任意类型,如果没有明确,那么就是Object以及任意的Java类了。无界通配符用>表示,?代表了任何的一种类型,能代表任何一种类型的只有null(Object本身也算是一种类型,但却不能代表任何一种类型,所以List和List的含义是不同的,前者类型是Object,也就是继承树的最上层,而后者的类型完全是未知的)。
三、多态
1.概念:多态是同一个行为具有多个不同表现形式或形态的能力,也就是同一个接口,使用不同的实例而执行不同操作。多态性是对象多种表现形式的体现。
(比如:现实中,比如我们按下 F1 键这个动作时:
(1)如果当前在 Flash 界面下弹出的就是AS 3的帮助文档;
(2)如果当前在 Word 下弹出的就是 Word 帮助;
(3)在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。)
2.优点:
(1)消除类型之间的耦合关系
(2)可替换性
(3)可扩充性
(4)接口性
(5)灵活性
(6)简化性
3.成员的特点:
(1)多态成员变量:编译运行看左边,例如:
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
(2)多态成员方法:编译看左边,运行看右边,例如:
Fu f1=new Zi();
System.out.println(f1.show());//f1的引用类型是Fu,但实际类型是Zi,所以调用的是重写后的方法
4.实现方法:
(1)重写
(2)接口
(3)抽象类和抽象方法
5.多态的转型:
多态的转型分为向上转型和向下转型两种。
(1)向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
(2)向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型。
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。



