不同门类的继承关系比较

不同类型的继承关系比较
      类,抽象类和接口是java语言里三大基础类,它们各自有一定的继承关系,比如说类与类之间的继承,抽象类也是一种类,也可以理解为是一种继承关系,而接口稍微有点特殊,它不是通过子类来继承的,是通过子类来实现的,我们称实现这个接口的为实现类,在这里也暂时的类比成类与类之间的继承关系。那么这些继承关系有什么异同呢?又各自有什么特点呢?
       普通类比较简单,类与对象是java里最基本的概念。两个类之间可以通过关键词extends来继承。比如public class person{private String name;public void walk();},public class student{private String name;public void study();}。这两个类之间怎么继承呢?public class student extends person{}
这里person类是父类,student类是子类,通过extends发生了继承关系,那么student类具有了父类之中的一些方法与属性。之所以说是一些是因为即使继承,但如果在父类里面的属性是private或者protected的,那么子类是无法拥有父类的这些属性的。
      抽象类,顾名思义是一种类,同时也是一种抽象的类。什么是抽象的类呢?类包含两大方面,一个是属性,一个是方法,即函数。抽象类既然是类,那么肯定具有这两种特性。但是在抽象类里面的方法与普通类有点区别,在抽象类里面,方法是一种抽象方法,抽象方法是一种没有方法体的方法,它是一种没有意义的方法。也就是说这种方法只提供了一个名称,但是没有给出具体的实现方法。当然抽象类里面也可以有普通方法,也可以没有抽象方法。它是在声明类的时候通过关键字abstract来声明抽象类的。抽象类在调用时是不能直接通过构造函数来创建对象的,因为用创建对象就得拿来调用方法,而抽象类里的方法都是没有意义的。但我们必须得通过一种方法来实现这种调用。因此,这里还得通过继承关系。用一个子类来继承抽象类,此时必须要在子类中实现抽象类的抽象方法,之后通过自动转型来创建对象。
     接口与两者的区别在于,在接口里面都是抽象方法,即只能有抽象方法。它通过interface来声明,而实现类的话则是通过imeplements。凡是此种关系,在父类里面只要有抽象方法,那么在子类里面就必须实现它的抽象方法。
     接口与抽象类有一定的区别,这里作一个简单的概括:

               接口                                     抽象类
         
多继承         支持                                      不支持
类型限制       没有                                    有,只能是引用类型
方法实现     继承类型中必须给出方法实现                继承类中可以不给出
扩展性       比较麻烦                                  相对比较灵活
多层继承     比较麻烦,需要借助虚函数                   比较灵活
       
   以上只是分析了普通类与抽象类,与接口之间的继承关系,那抽象类与实体类之间,接口与接口之间和抽象类与接口之间是否又有同样的继承关系呢?在很多的java面试里面都可以看到一道题,抽象类可以继承实体类吗?答案是可以的,但是有一个前提是,实体类必须有明确的构造函数。API里每个类都是间接或直接继承Object类的,而Object是一个实体类,也就是说抽象类可以继承实体类,而这句话后半部分意思是说:在父类里面必须有子类可以访问到的构造器,父类不能声明为final。抽象类也是可以实现接口的,比如java.util中的AbstractCollection类就是实现的Collection接口,而且可以不实现接口中所有的方法,可以通过抽象类的子类来实现。比如:interface ITest {
    void test1();
    void test2();
}

public abstract class Test implements ITest { //抽象类不用全部实现接口中的所有方法

    public void test1(){

         System.out.println("test1!!");

    }

}

class TestChild extends Test { //上面接口ITest 中剩余的方法test2,在该抽象类Test 的子类TestChild 去实现即可。

    @Override
    public void   test2() {
          System.out.println("test2!!");
    }

}

所以抽象类实现一个接口时,不用全部声明实现接口中的所有方法。
    因为抽象类可以有普通方法,也可以有抽象方法,所以抽象类是可以继承实体类和抽象类的,也可以实现接口的。
   接口是可以继承接口..但是要使用extends~而不是用implements

如:interface a{}

interface b extends a{}
        总结:实体类可以继承抽象类和实现接口;抽象类可以继承实体类和接口;接口也可以继承接口,但不能实现接口。接口解决了java里只能单根继承的问题,接口是可以多继承的。各自有各自的优势,但也有各自的劣势,而普通类的继承与抽象类和接口的继承的区别主要在抽象方法的实现。