1 多态和抽象
1.1 多态
什么是多态?
多态是指同一个行为具有多个不同的表现形式或形态的能力。(相同的行为,不同的实现)
多态分为静态多态(编译时多态、早绑定)和动态多态(运行时多态、晚绑定)
1.1.1 静态多态
静态多态:调用在一个类中有多个具有相同名称和不同参数列表的方法。它使用方法重载实现。
1.1.2 动态多态
动态多态:允许不同类的对象对同一行为(方法)作出响应。即同一行为可以根据发送对象的不同而采用多种不同的表现方式。它使用动态绑定技术和方法重写实现。
动态绑定技术:(dynamic binding)也叫延时绑定或后期绑定,是指在执行期间而不是编译时判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。由于动态绑定实在执行期实现,这将导致Java程序在运行时性能下降,这也是Java程序性能不如其他语言程序编写的程序的一个主要原因。
动态绑定的条件是什么?
1、要有继承
2、要有方法重写
3、要有父类变量引用子类对象
4、要有父类变量调用重写的方法
类的类型转换规则
1、一个父类引用类型变量可以引用其子类的对象;
2、一个父类引用类型变量不可以访问其子类对象新增加的成员变量和方法
3可以使用instanceof关键字来判断引用类型变量所引用的对象是否属于某一个类。
即判断子类是否是相应的父类的子类。
什么是向上转型?
在继承关系中,子类的对象可以直接当做父类的对象使用,称为向上转型。
什么是向下转型?
在继承关系中,从父类对象到子类对象的转换,称为向下转型。向下转型要用强制类型转换。
注意:向上转型是安全的,向下转型是非安全的。建议使用向下转型时,先使用instanceof关键字验证具体的子类类型再进行强制类型转换。
Pet pet=new PetDog();向上
PetDog dog=(petdog)new PetDog(); 向下
1.1.3 多态的作用(优点)
1、可替换性。多态对已存在的代码具有可替换性。
2、可扩展性。多态对代码具有可扩展性,增加性的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上,新加的子类更容易获得多态功能。
3、接口性。多态是父类通过方法签名,向子类提供了一个共同的接口,由子类来完善或覆盖它而实现的。
4、灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
5、简化性。多态简化了对应用程序的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤其突出和重要。
值得注意的是,多态并不能够解决提高执行速度的问题,因为它是基于动态绑定。 Object类的getClass()方法可以获取引用类型变量所引用的实际对象类型。
当多态机制导致引用变量的声明类型和实际引用对象的类型存在不一致,使用instanceof运算符来判断引用变量所引用的实际对象类型与某类之间的继承关系。
1.1.4 什么是抽象类?
使用了关键字abstract声明的类叫做抽象类。如果一个类里包含一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”属于一种不完整的方法,只含有一个方法签名,没有方法主体。
抽象类的特点是什么?
1、抽象类是不能实例化对象;
2、如果从抽象类继承一个类,就必须为抽象类中的所有抽象方法提供方法的定义,否则继承的类也会变成抽象类;
3、即使不包含任何abstract(抽象方法),也可以将一个类声明为“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。
1.2 接口
接口就是一套规范 一套标准
1.2.1 接口的特点
1 在Java中,使用interface关键字来定义接口;
2 接口中的方法都是抽象方法(只有方法方法名,没有方法体)
3接口不能被实例化 ,接口可以被类实现,类实现接口使用implements关键字,一个类可以实现多个接口;
4当一个类实现某个接口时,必须实现这个接口定义的所有抽象方法,否则这个类必须定义成抽象类。
5 接口中可以定义成员变量,但这些变量默认是public static final修饰的,变量值不能更改,这种变量也叫常量
1.2.2 接口的作用(优点)
1、接口可以用来对类提供规范,避免了类的设计上的不一致性;
2、接口可用于间接实现多重继承;
3、一定程度上保证了代码的安全性,使用者只需要通过调用接口提供的方法,而隐藏方法的具体实现。
1.2.3 接口与抽象类的区别
相同点:
1、接口和抽象类都不能被实例化,他们都位于继承数的顶端,用于被其他类的实现和继承。
2、接口和抽象类都是可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
不同点:
1、接口只能包含抽象方法,不能包含已经提供实现的方法;
抽象类则完全可以包含有现实的方法。
2、接口不能定义静态方法,抽象类可以定义静态方法;
3、接口里面不能够包含初始化块、构造器;但是抽象类里面完全可以包含初始化块和构造器;
4、一个类最多只能继承一个抽象类;但是一个类可以实现多个接口,通过实现多个接口可以弥补Java中的单继承的不足。
5、实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法,接口中则必须全部是抽象方法。