一、抽象类的特点
1、抽象类和抽象方法必须用abstract关键字修饰。
2、抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口。一个抽象类如果没有抽象方法,是可以定义为抽象类的。这么做的目的只有一个,就是不让其他类创建本类对象,交给子类完成。
eq: abstract class 类名(){
public abstract void eat();//抽象方法
public void drink(){
system.out.print(“喝水”);
}//非抽象方法
}
3、抽象类不能实例化,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
4、abstract不能和哪些关键字共存?
- abstract和static
* 被abstract修饰的方法没有方法体。
* 被static修饰的方法可以用类名.调用,但是类名.调用抽象方法是没有意义的。
- abstract和final
* 被abstract修饰的方法强制子类重写
* 被final修饰的方法不让子类重写,所以他两是矛盾的
- abstract和private
* 被abstract修饰是为了让子类看到并强制重写
* 被private修饰不让子类访问,所以他两是矛盾的
二、接口
1、接口概述:
从狭义的角度讲就是指java中的interface
从广义的角度讲对外提供规则的都是接口
2、接口特点:
接口中定义的全都是抽象方法。
接口用关键字interface表示。即interface 接口名 { }
类实现接口用implements表示。即class 类名 implements 接口名 { }
接口不能实例化。按照多态的方式来实例化。
接口的子类
* 可以是抽象类,但是意义不大。
* 可以是具体类,要重写接口中所有的抽象方法。(推荐方案)
3、接口成员变量的特点
成员变量:
只能是常量,并且是静态的、公共的。
默认修饰符:public static final
建议:自己手动给出。
构造方法:
接口没有构造方法。
成员方法:
只能是抽象方法。
默认修饰符:public abstract
建议:自己手动给出。
三、异同点
相同点:
(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点:
(1)接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。
(6)接口没有构造方法。