继承可以被定义为其中一个对象获取的另一个特征的过程。使用继承的信息是在一个等级秩序作出管理。
当我们谈到继承,最常用的关键字是extends和implements。这些话会确定一个对象是否IS-A类型的另一个。通过使用这些关键字,我们可以使一个对象获得另一个对象的属性。
IS-A(是一个)是一种表达:这个对象是一个类型的对象。让我们来看看如何使用extends关键字来实现继承。
public class Animal{ } public class Mammal extends Animal{ } public class Reptile extends Animal{ } public class Dog extends Mammal{ }
现在,根据上面的例子中,在面向对象的术语中,满足下列条件:
动物是哺乳动物类的超类。
动物是爬虫类的超类。
哺乳动物和爬行动物是动物类的子类。
狗是哺乳动物双方和动物类的子类。
现在,如果我们考虑了IS-A关系,我们可以说:
哺乳动物IS-A 动物
爬行动物IS-A的动物
狗IS-A哺乳动物
因此:狗IS-A动物
使用extends关键字的子类就可以,除了超类的私有属性外,它继承超类的所有属性。
我们可以保证,哺乳动物实际上是与使用实例操作符的动物。
public class Dog extends Mammal{ public static void main(String args[]){ Animal a = new Animal(); Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
这将产生以下结果:
true true true
既然extends关键字让我们研究如何使用implements关键字来获得对IS-A关系有很好的理解。
implements关键字被使用的类从接口继承。接口永远不能凭借它的类进行扩展。
public interface Animal {} public class Mammal implements Animal{ } public class Dog extends Mammal{ }
用instanceof操作符检查确定哺乳动物是否实际上是一个动物,而狗实际上是一种动物
interface Animal{} class Mammal implements Animal{} public class Dog extends Mammal{ public static void main(String args[]){ Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
这将产生以下结果:
true true true
这些关系主要是基于使用。这就决定了某一类是否 HAS-A 某一个东西。这种关系有助于减少重复代码,以及错误。
让我们研究一个例子:
public class Vehicle{} public class Speed{} public class Van extends Vehicle{ private Speed sp; }
这表明,Van类 HAS-A Speed类。通过让飞车一个单独的类,我们不必把属于加速Van 类中的全部代码。这使得它可以重复使用Speed类在多个应用程序。
在面向对象的功能,用户无需理会哪个对象是做实际工作。要做到这一点,Van类隐藏用户的执行细节。所以基本上会发生什么是用户会问Van类来执行某些动作,Van类要么本身做的工作或要求另一个类执行的操作。
要记住的一个非常重要的事实是,Java只支持单一继承。这意味着,一个类不能扩展多个类。因此,以下是非法的:
public class extends Animal, Mammal{}
因此,一个类可以实现一个或多个接口。这使得Java要摆脱多重继承是不可能的。