一,抽象
抽象类是用于捕捉,抽取子类通用共性的一种类。它只能用作父类,用于提供给子类继承,不能被实例化。
public abstract class Dog{
public abstract eat();
}
抽象类用abstract修饰
使用抽象类需要注意几点:
- 抽象类不能实例化,实例化的工作交给子类完成,它只需要一个引用即可。
- 抽象方法必须由子类重写。
- 只要包含一个抽象方法的类叫抽象类,不管是否还包含其他方法。
- 抽象类可以包含具体方法,也可以不包含抽象方法。
- abstract与final不能修饰同一个类。
- abstract与final,private,static不能修饰同一个方法。
- 一个类继承了抽象类,子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,那么必须将子类定义为抽象类,由子类的子类实现子类的抽象方法。
public abstract class Animal{
public abstract void eat();
}
public class Dog extends Animal{
@Override
public void eat(){
System.out.println("狗吃骨头");
}
public static void main(String args[]){
Dog d = new Dog();
d.eat;
}
}
输出结果:
狗吃骨头
二,接口
官方定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。
接口是一个集合,它不是类。接口和抽象一样不能被实例化,但接口可以使用implements 关键字来实现。接口可以有方法和变量,但是接口的变量会隐式地指定为public static final变量,而方法会隐式地指定为public abstract。
使用接口需要注意几点:
- 接口的所以方法访问权限都自动被声明为public,并且只能是public,如果声明为private protectde,编译会出错。
- 在实现多接口的时候一定要避免方法名重复。
- 在java8以后,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。
public interface InterfaceExample{
public void fun1();
public void fun2(){
System.out.println("fun2");
}
}
public class InterfaceImplementExample implements InterfaceExample{
@Override
public void fun1() {
System.out.println("fun1");
}
public static void main(String args[]){
InterfaceExample ie = new InterfaceImplementExample();
ie.fun1();
}
}
三,接口和抽象的区别
- 从设计层面来看,抽象类提供了IS-A关系,那么就必须满足里式替换原则,,即子类必须能够替换所以的父类对象。而接口是LIKE-A关系,它只是提供一种方法实现的契约,并不要求接口和接口实现的类提供IS-A关系。
- 从使用上来看,一个类可以实现多个接口,不能继承多个抽象类。
- 接口的变量只能是public static final类型,而抽象则没有限制。
- 接口的方法只能是public的,而抽象的方法可以有多种访问权限。
- 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。