一,抽象

抽象类是用于捕捉,抽取子类通用共性的一种类。它只能用作父类,用于提供给子类继承,不能被实例化。

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的,而抽象的方法可以有多种访问权限。
  • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。