2.抽象类和接口
抽象类:在描述事物时,没有足够的信息描述一个事物,这时这个事物就是抽象的。
即在定义一个对象(类)的时候,无法对某个方法进行具体化。
特点: 1.抽象类和抽象方法都需要被abstract关键字修饰,抽象方法一定要定义在抽象类中,
但抽象类中可以不全部是抽象方法
2.抽象类不可以创建实例,原因是调用抽象方法无意义
3.只有覆盖了抽象类中所有的抽象方法后,子类才可以实例化,否则仍是一个抽象类
细节: 1.抽象类一定是一个父类吗?
抽象类一定是父类,因为抽象类是通过不断向上抽去得来的,一定有某个或某些类实现了
它的抽象方法
2.抽象类是否有构造方法?
有,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始化
3.抽象类中是否可以不定义抽象方法
可以,abstract关键字的存在可能仅仅是不允许该类实例化
4.抽象关键字abstract不可以和哪些关键字共存?
final final修饰的类没有子类
private private修饰的类不允许被覆盖
static 静态修饰的类会在编译时自动就实例化了,固可以直接调用,但抽象类不允许实例化
抽象类与一般类的异同点: 同:1.它们都是用来描述事物的 2.它们里面都可以定义属性和方法
异: 1.一般类可以具体地猫叔事物,抽象类描述的事物信息不具体
2.抽象类中可以定义一个成员:抽象方法
3.一般类可以实例化(创建对象),抽象类不行
接口:一种抽象类型,是抽象方法的集合,用interface声明,且其中的成员有固定的的修饰符
变量的修饰符:public static final 方法的修饰符:public abstract
特点: 1.接口不可以创建对象
2.子类必须实现接口中内所有的抽象方法,否则子类就是一个抽象类
3.接口不可以被类继承extends,只可以被实现implements
接口的作用: 1.接口的出现对功能实现了扩展
2.接口的出现定义了规则
3.接口的出现降低了耦合性 PS:甲在使用这个规则。乙在实现这个规则
注意:类负责描述事物的基本功能(属性和方法),而接口负责描述事物的扩展功能(抽象方法)
举例(网上摘抄):
抽象函数的作用有很多,我就举一个例子,(mars老师的例子):
打印机:
父类---Printer
子类---HBPrinter
子类----CanonPrinter
测试类----Test
//定义一个打印机类
abstract class Printer{
//定义三个成员函数
void open(){
System.out.println("open");
}
void close(){
System.out.println("close");
}
abstract void print();
}
//定义一个HB(惠普)打印机
class HBPrinter extends Printer{
//复写Printer的print
void print(){
System.out.println("我是惠普打印机");
}
}
//定义一个佳能打印机
class CanonPrinter extends Printer{
//复写Printer的print方法
void print(){
System.out.println("我是佳能打印机");
}
}
//测试函数
class Test{
public static void main(String args [] ){
//向上转型
Printer p1 = new HBPrinter();
p1.open();
p1.print();
p1.close();
Printer p2 = new CanonPrinter();
p2.open();
p2.print();
p2.close();
}
}
输出
open
我是惠普打印机
close
open
我是佳能打印机
close
如果父类Printer没有用abstract其方法print也没用abstract,那么当其子类有很多时,突然某一个子类忘记复习print()方法,
那么问题就出现了:可以正常运行,但是打印有问题,不知道哪里出错了,
而当有用抽象,那么其子类忘记复写时,就会出错,提示哪一个有问题,就可以bug