一、适配器模式
ex:
interface AA{
void test1();
void test2();
void test3();
void test4();
void test5();
void test6();
void test7();
void test8();
void test9();
}
//上面的接口有9个抽象方法,如果我们只需要其中两个,而用普通的类去实现的话需要把九个都实现,增加工作量
//以下是适配器
abstract class AAA{
public void test1(){}
public void test2(){}
public void test3(){}
public void test4(){}
public void test5(){}
public void test6(){}
public void test7(){}
public void test8(){}
public void test9(){}
}
//我需要用test1(),test2()
class BB extends AAA(){
public void test1(){
System.out.println("我实现了test1");
}
public void test2(){
System.out.println("我实现了test2");
}
}
在一般开发中,如果接口中的抽象方法太多而又用不着所有方法,就可以创建一个适配器,适配器是抽象类,因为抽象类既可以有抽象方法也可以有实现好了的方法,例如空方法体方法
二、多态
1.定义:某一类事物的多种存在形态
2.代码:
//多态:父类可以接受子类实例对象
class Fruit{}
class Apple extends Fruit{}
class Banana extends Fruit{}
class Orange extends Fruit{}
class Person{
public void eat(Fruit obj){
System.out.println("吃:"+obj);
}
}
class Test{
public static void main(String[] args){
new Person().eat(new Apple());
new Person().eat(new Banana());
}
}
编译通过,因为Person类中的eat()可以接受Fruit类的实例对象,而Apple、Orange、Banana继承了Fruit,所以它们三个也可以被eat接收
3.转型:
java中向下转型必须先向上转型:
Furit f = new Apple();
Apple a = (Apple)f;/*但是不可以这样做
Banana b = new Apple();
毕竟苹果和香蕉是处于同一级的,而且苹果不可能转换成香蕉,无论从生物学来说还是JAVA
4.instanceof()
这是判断实例x是否属于类型a
Fruit f = new Apple();
if(f instanceof Apple){
System.out.println(“水果f是苹果”);
Apple a = (Apple)f;
}
else{
System.out.println(“很遗憾,它不是苹果”);
}
关于多态的几点:
- 多态可以使形参接收更多类型参数,但不建议使用Object(Object是所有类的根类,用object意为这个方法可以接收所有类型的参数)
- 如果用父类接收子类对象,只能调用父类和子类都有的方法
- 如果用父类接收子类对象,调用父类和子类共有的方法时,调用的是子类的方法
关于类设计:
- 类的设计主要是父类的设计
- 子类永远不要去继承一个已经完全实现好了的类,因为一旦发生向上转型,所调用的方法一定是被子类覆盖过的方法,所以只会继续继承抽象类或接口