设计一个Person类,类中定义一个doWork的方法。设计若干子类,对于doWork()这个方法进行不同的实现,如学生,工人,警察,教师等。
在java中设计类的方法时,如果方法没有实现(非空实现),则必须声明为抽象的,用关键字abstract修饰;
如果一个类中,只要有一个抽象方法,那么这个类必须声明为抽象类;
抽象类的概念:
一个类一旦声明为抽象类,则此类不能构造对象;为什么?
问题1:抽象类中是否可以有构造器?有!
问题2:能否构造对象?不能!
问题3:在抽象类中构造器的作用是什么?在构造具体子类对象时调用!
抽象方法决定抽象类!
如果一个类是抽象类,那么类中是否一定要有抽象方法?不一定!
可以有,也可以没有!
什么样的类是抽象类?用abstract关键字修饰的类是抽象类。
具体父类型可以作为引用类型的声明;
抽象父类型也可以作为引用类型的声明;
问题4:如果设计一个抽象类,类中定义一些具体方法和一些抽象方法,那么什么样的方法可以被调用?
问题5:如何使用抽象类中的实例方法?
如果一个具体子类继承抽象类,那么就要实现抽象父类中的所有抽象方法;
在子类中重写父类方法时,访问级别要大于等于原有访问级别;
具体子类继承抽象父类,子类中嵌套父类,无论父类是抽象的还是具体的,都不是做为一个独立的结构体存在;
接口:interface
统一的标准
1、常量字段
2、抽象方法
接口设计:
interface MyInterfaceB { int NUM = 10; // public static final String NAME = "sunzone"; } interface MyInterfaceC { double PI = 3.14; void ma(); // public abstract int op(int x, int y); } interface Driver { Connection getConnection(); //... } |
实现类与接口的关系也是“is-a”关系。
Is-a体现为两个关键字:extends和implements
在定义方法时,具体类可以做形参,抽象类可以作形参,接口可以做形参;
但谁做实参?
无论谁做形参,实参一定是具体类对象!
具体父类的具体子类;
抽象类的具体子类;
接口的具体实现类;
接口之间的关系:
两个接口之间没有关系;
有继承关系,而且支持多继承;子接口与一个或多个父接口的关系
interface ICa {
void m1();
void m2();
}
interface ICb {
int m2();
}
interface ICab :ICa, ICb {
}
class IcabImpl implements Icab{
public void m1(){
//…
}
void ICa.m2(){
//..
}
int ICb.m2(){
//…
}
}
IcabImpl ii = new IcabImpl();
ICa ca = ii;
ca.m2();
ICb cb = ii;
Console.WriteLine(cb.m2);
类与接口之间的关系:
类可以在继承一个父类的基础上,实现多个接口;
粗粒度接口(不要设计这样的)
精粒度接口(推荐)
精粒度接口可以精细到只有一个方法(类库中大量存在),这样的方法称为“功能性”方法,接口称为“功能性”接口。
接口与抽象类的异同?
相同之处:
1、 不能构造对象
2、 都可以定义抽象方法
3、 设计的目的是为了被继承或被实现
4、 与子类或实现类的关系都属于is-a,可以用抽象类或接口的引用来作类型声明,进而统一调用具体子类或具体实现类;
不同之处:
1、 类中可以有构造器,但接口中没有
2、 最重要的区别:无论继承链的长短,继承链上所有的类都是同一类事物;同一个接口中实现类,可以没有任何关系。
3、 类中可以有抽象方法,也可以有具体方法,但接口中的方法都是抽象方法;
4、 顶层抽象类是Object类的子类,它继承了父类的所有成员;而接口中则除了自定义的的成员外,没有额外数据;接口是“轻量级”的抽象类,或者说是100%的抽象类;
5、 类编程时,内聚性低,耦合度高;接口编程,内聚性高,耦合度低
面向抽象类的编程和面向接口的编程:
Io:处理文件流的章节,设计使用的就是“面向抽象类”的编程
集合:“面向接口”的编程
类关系:
is-a,has-a,use-a
|
|
|