Java教程

javaSE_Day_010

本文主要是介绍javaSE_Day_010,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

22 面向对象的三大特征:多态

(1)说明:多态是指对象具有多种形态,对象可以存在不同形式中。

  • 利用对象的多种状态(变化的状态),就可以完成代码中一些特殊要求。

(2)多态也被细分为两种:

  • 方法多态(重载):根据不同参数可以得到方法不同状态。
  • 对象多态(对象的多种状态):同一事物(行为)被不同对象所触发得到的结果不同。

(3)多态的实现必须有一个必要前提:类与类之间有继承关系或者类与接口之间有实现关系。

(4)多态的存在:为了达到方法的最大通用性和扩展性,可以使用多态中对象多态,利用父类和子类的继承关系完成对象的向上转型和向下转型操作,以完成对事物的不同操作。利用多态的作用,当把不同的子类对象当做父类类型看待时,可以屏蔽不同子类之间的实现差异,从而达到通用编程,以便适用不同的需求变化。

22.1 里氏代转换原则

使用里氏代转换原则完成多态的效果(必须是继承或实现关系),里氏代转换原则就是利用对象不同形态完成事务的触发得到不同的结果。

(1)对象的向上转型:

  • 说明:父类的引用(对象)可以接受一个子类的引用(对象),此时子类会被自动提升为父类类型。
  • 语法:
语法:
		父类类型 对象  = new  子类类型();
  • 特点:此时子类对象会被自动提升为父类类型,只能调用父类的属性和方法,子类中新定义的属性和方法无法调用。

(2)对象的向下转型:

  • 必要前提:必须要使用已经被转换提升之后的父类对象。
  • 说明:将已经被提升为父类类型的队形转换为原有的子类类型的过程。
  • 语法:
语法:
	子类类型  子类对象名 = (子类类型)被提升为父类的类型对象;
  • 特点:此时被转换为子类类型对象之后,既可以调用父类的属性和方法,也可以调用子类自身的属性和方法。

22.2 多态使用时需要注意的问题

(1)向上和向下转型问题:

  • 向上转型必须有继承关系或实现关系,如果是两个毫无关联的类,则不会转型成功。
  • 一旦子类提供了重写父类方法,无论是否转型创建对象(即向上转型创建还是向下转型创建),调用的一定是子类重写之后的方法。
  • 必须是提升之后的父类对象,才可以转换称为原有的子类类型。
  • 多态主要是提供可扩展性和可维护性,好处就是可以利用多态让方法使用起来更加高效(子类类型都可以使用),可以辅助抽象类和接口创建对象;弊端在于若果利用父类作为方法参数类型或返回值类型的时候,返回和接收的属性都会被向上转型为父类类型,子类自己的属性和方法无法调用,这样会牺牲一部分的灵活性,如何弥补就是向下转型。

23 抽象类和抽象方法

23.1 抽象方法

(1)说明:使用abstract关键字进行修饰并且没有方法体,存在抽象类中的方法叫抽象方法。

(2)特点:

  • 使用abstract关键字进行修饰,并且方法没有方法体,主要是留给子类来进行重写实现。
  • 抽象方法修饰符不能使用private、static和final进行修饰。只要使用这三个修饰符,方法就无法进行重写了,所以就失去了冲向方法的目的。
  • 抽象方法若存在类中,这个类必须是抽象的。

23.2 抽象类

(1)说明:使用abstract关键字修饰的类就是抽象类。

(2)特点:

  • 抽象类不能创建对象,不能通过new 抽象类类名()创建对象,因为抽象类中会存在抽象方法,这个抽象方法没有方法体,如果抽象类可以通过new 抽象类类名()创建对象,那么抽象方法就失去了意义。
  • 抽象类可以包含抽象方法,也可以不包含抽象方法。若包含抽象方法,子类在继承抽象类之后,必须实现这个抽象方法抽象类需要有构造方法,给继承它的子类。
  • 普通类继承抽象类后必须实现抽象类中的抽象方法。
  • 抽象类其实就是一个父类的扩展版本,抽象类具有所有类的操作,只不过多了一个抽象方法和abstract修饰。

(3)总结:抽象类的提供只有一个目的,提供继承作用(父类作用),父类中提供某些需要子类必须重写的方法,利用抽象方法的特点对子类进行提示。抽象方法若存在类中必然是抽象类,所以抽象类就是一个特殊的父类,父类具备的操作抽象类都具备,并且还可以提供抽象方法。

  • 只要是创建父类,这个类就可以声明成抽象类,不仅可以具备父类所有操作,而且可以具备提示子类必须要重写的方法。虽然抽象类不具有直接创建对象的能力,但是它具有多态性。

24 接口

接口是一个特殊的抽象父类。

(1)什么是接口:

  • 硬件接口:指的是两个硬件设备之间的连接方式,硬件接口既包括物理上的接口,还包括逻辑上的接口(数据传输协议)。
  • 软件接口:程序代码,特殊的抽象类,表示一种规范,是具有N个方法的特征集合。

(2)说明:

  • 在封装的时候,手机大多会留有一个接口,这个接口就会出现充电和耳机要遵守的一些协议,通过这些协议可以约束手机可以通过什么样的方式来进行数据传输(多使用在硬件方向)。
  • 在Java中,接口便是一种规范(约束、要求),实现者必须遵守该规范,约束使用者该怎么做。Java 中接口还可以解决一些非继承关系的问题,例如:飞机是会飞的,鸟也是会飞的,这两个类有一个共同行为“飞”,但是飞机和鸟明显不属于同一个父类。既想要约束飞机和鸟必须存在的这个方法,又不想提供继承的这样操作,可以使用接口来进行实现。
  • 接口就是在设计一套要遵守的行为规范,但是这个规范并没有强加联系(彼此之间不是强关联【继承关系】),而是约束关系,如果要想按照这个规则形式就必须实现接口。
  • 接口只是定义了类应当遵守的规范,却不关心这些类内部数据和其功能的具体实现细节。站在程序的角度上,接口只规定了类中必须提供的方法,从而分离了规范和实现,增强了可扩展性和可维护性。

24.1 接口的定义和使用

(1)说明:接口是一个特殊的抽象父类,接口是n个方法的集合,所以接口中只能定义方法和静态全局常量,剩余类中的定义都不支持。

(2)语法:

访问权限修饰符 interface 接口名 {
    
    public static fianl 修饰的全局常量;
    public abstract 修饰抽象方法;
    
    //1.8 之后提供了两个新方法
    public 修饰的default(这个方法允许有方法体,并且可以重写)
    public 修饰的static(这个方法允许有方法体,但是不允许重写)
}

(3)特点:

  • 接口是没有构造方法的,接口是不能直接创建对象的。
  • 上面语法写的修饰符可以在实际接口定义中省略不写,默认修饰。
  • 接口的本意就是让类来进行遵守实现的,所以接口都是public修饰的。
  • 接口和类的关系是实现关系(其实这个实现关系就是隐式的继承)。
    • 可以将接口看作是父类,实现这个接口的是子类。
  • 类与接口建立关系的时候可以使用implements关键字来建立。
  • 类和接口是实现关系(隐式继承),所以接口支持实现类之间的多态关系。
    • 接口是引用类型,并且允许多态。

24.2 接口需要注意的问题

  • 发中规定接口名必须以大写字母I开头,除非接口名字单词第一个是大写字母I,实现接口的类必须以Impl作为类名结尾,这个类就代表着实现接口类。
  • 一个类是允许一次性实现多个接口的,Java用这种方式来模拟多继承。实现接口时每个接口名之间使用逗号分隔。
  • 接口属于类的扩展,Java中类是单一继承,类与接口的语法中是允许一个类既可以继承于另外一个类,还可以实现多个接口。
  • 接口本身是允许多继承的。接口只允许继承接口不允许继承类。
  • 如果实现接口的类是一个抽象类,那么这个抽象类可以实现接口中的抽象方法,也可以不实现
这篇关于javaSE_Day_010的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!