什么是抽象类?抽象类就是只声明方法的存在而不去具体实现它的类。为什么要定义抽象类呢?我们假设有一个父类Animal,它有两个子类Dog和Horse,两个子类都有继承自父类的eat()方法,但狗要吃肉,马要吃草,所以可以把父类抽象为抽象类,父类的eat()方法抽象为没有方法体的抽象方法,具体吃什么,怎么吃,就让不同的动物子类分别去实现。下面说一下它们的定义:

首先,定义抽象类只是在class前面加了个abstract修饰,例如:abstract class Animal{};定义抽象方法和定义普通方法相比有以下不同:1、抽象方法不能用private和static关键词进行修饰。2、在返回类型前用abstract关键词修饰。3、当然,不能有方法体。例如:public abstract void dog();

然后,总结了抽象类和抽象方法的一些规则。1、抽象类和抽象方法都得用abstract修饰。2、抽象类不能被实例化,为啥嘞?假如可以被实例化,当用实例化的对象去调用抽象方法时,抽象方法却没有方法体,系统不就不知道怎么办了吗。同样的道理,下面说到的接口也不能被实例化。3、说一下包含关系,定义一个抽象类,类体中可以只有抽象方法,也可以没有抽象方法,还可以既有普通方法又有抽象方法,总之,怎么都行;但是,如果一个类中含有抽象方法,那么这个类就必须被声明为抽象类。

那么有抽象类了为什么还要定义接口呢 ?抽象类抽象出来的方法只能是它的子类使用,也就是要使用一个抽象方法的子类它们有同一个父类,举个例子:有个抽象类Animal,里面有抽象方法move(),能实现该抽象方法的只能是Animal的子类,若是定义一个Move接口也有move()方法,所有能够用到的类都可以实现这个接口,例如Car类,

class Car implements Move{  public void move(){    System.out.println("车往前开,后退,停止");  }}

Dog类,

class Dog implements Move{  public void move(){    System.out.println("狗用四条腿跑");  }}

这两个类没有共同的父类,但却能实现同一个接口。接口的定义格式:举个例子吧,定义个A接口:public interface A extends B,C,D{};可以看出来,和定义类一样,只是把class换成了interface,而且接口也是可以继承接口的,并且和类只能有一个父类不同,接口可以有多个父接口,父接口之间用逗号隔开。注意:在接口中只能定义常量和方法。一个类实现接口时就是在类名后面加上 extends关键字,关键字后面跟接口名。

接口也是JAVA中的一种数据类型,下面举一个接口回调的例子:

public interface People{  //定义一个接口  void Say(String s);}public class Teacher implements People{  public void Say(String s){    System.out.println(s);  }}public class Student implements People{   public void Say(String s){    System.out.println(s);  }}public class Test{  public static void main(String[] args){    Peo tea;//声明接口变量    tea=new Teacher()//接口变量中存放对象的引用    tea.Say("我是老师")//接口回调    tea=new Student()//接口变量中存放对象的引用    tea.Say("我是学生")//接口回调  }}

从这个程序看来,我认为接口回调和继承中的向上转型本质上是相似的,声明的变量tea分别是Teacher和Student的对象,但它是Peo类型的。




java为什么抽象函数_java抽象类与接口的区别