一、抽象类
父类中的某些方法存在的意义就是让子类重写的,因此该方法的函数体的代码没有意义,但是不屑就会报错,so,如果一个方法不需要函数体部分,则可以将这个方法声明为抽象方法
抽象方法:没有方法体的方法,java中使用abstract关键字声明抽象方法
格式:
访问修饰符 abstract 返回值类型 方法名称();
public abstract class A(){
//约束有人帮我们实现
//abstract,抽象方法,只有方法名,没有方法的实现!
public abstract void doSomething();
}
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法
public class B extends A(){
@Override
public void doSomething(){
}
}
抽象类的特点
- 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类
- 抽象类不能使用new关键字来创建对象,它是用来让子类继承的
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的
- 子类继承抽象类,就必须要实现抽象类没有实现的抽象方法,否则盖子类也要声明为抽象类
二、接口
1.定义接口
定义普通的类或者抽象类可以使用class关键字,定义接口必须interface关键字完成,java中的接口是可以多实现的。
接口本质上就是特殊的类,特殊抽象类,接口中的所有的方法都是没有实现的(抽象方法)。
接口中的所有方法和属性都是默认是public,即便没有使用public修饰!
接口的实现使用的是implements关键字实现接口,子类一旦实现了接口,必须要实现接口所有的抽象方法,如果不想实现,则必须将子类声明为抽象类,接口也无法实现实例化,必须使用子类,以多态的形式完成实例化。
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是……则必须能……”的思想,比如:如果你是汽车,你就必须能跑,等等。制定了之后就必须遵守。
public interface UserService(){
//常量--默认public static final
int a = 111;
//接口中的所有定义方法其实都是抽象的--默认public abstract
void add(String name);
void delete(String age);
void update(String address);
}
public interface TimeService(){
void time();
}
//抽象类:extends
//类 可以实现接口 implement 接口
//实现了接口的类,就必须重写接口中的方法
public class UserServiceImpl implement UserService,TimeService{
@Override
public void add(String name){
}
@Override
public void delete(String age){
}
@Override
public void update(String address){
}
@Override
public void time(){
}
}
2.接口中成员的特点
1. 接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量。
2. 接口中可以定义方法,方法也有固定的修饰符,public abstract
3. 接口中的成员都是公共的。
4. 接口不可以创建对象。
5. 子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类.
接口最重要的体现:解决多继承的弊端。
接口与抽象类的相同点:
- 都位于继承的顶端,用于被其他实现或继承;
- 都不能实例化;
- 都包含抽象方法,其子类都必须覆写这些抽象方法;
接口与抽象类的区别:
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;
- 接口只能包含抽象方 法;
- 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;
- (接口弥补了Java的单继承)
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类