多态和抽象从继承引出来的两个重要的概念,多态允许以多种形式存在,而抽象则允许创建抽象类。
在Java中,多态有两种理解方式:第一种是对象的不同的方法可以用相同的一个方法名,也就是重载的概念。另一种是同一对象根据不同的消息执行相应的行为,也可以这样认为发送消息给某一对象,让对象自行选择哪种相应的行为。根据这两种方式,所以多态分为静态多态和动态多态:
■静态多态指的是程序在编译时,系统就能决定调用哪个方法,所以也称为编译时多态。在Java中,静态多态实现的方法就是方法重载,其调用规则是依据对象在定义时的类型相应地调用对应类中的重载方法。
■动态多态指在运行中系统才能动态确定方法所指的对象,所以也称为运行时多态。动态多态的实现方式是重写父类的同名成员方法,其调用规则是依据对象在实例化时而非定义时的类型,相应地调用对应类中的同名成员方法。也就是说,动态多态主要通过动态绑定和重写的机制来实现。
在Java中,使用动态绑定和重写机制来实现多态,首先要掌握如下三个基础技术概念:
■向上转型技术:一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当做一个父类类型。
■instanceof关键字:instanceof关键字用于判断运行时对象的真正类型。
■动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。
向上转型和向下转型
向上转型:从低精度向高精度转换实行自动转换
向下转型:从高精度向低精度转换,用强制转换
对于引用数据类型
不可以和基本数据类型转换
引用数据类型必须是继承关系
父类的引用指向子类的对象,才可以通过
eg:Father fa = new Son();
Son son = (son) new Father();(不能通过)
eg:Father fa = new Son();
Son son = (son)fa;(通过)
(一个父类的引用变量可以指向不同的子类对象
或者说一个子对象可以被当做一个父类类型)
在Java中,如果我们不需要类的实例化时,就可以将类设计成为一个抽象类。所谓抽象类,是不能被实例化的类。在抽象类中,类的所有的其他功能都存在,成员变量、方法、构造器都可以用同样的方式访问,我们只是不能创建抽象类的实例。使用关键字abstract可以声明一个抽象类,该关键字可以出现在类声明时class关键字前的任何地方。
将一个方法声明为抽象方法有两个结果:①类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象类;②任何子类必须重写抽象方法,除非子类本身也是抽象的。
抽象方法没有方法体,一个包含抽象方法的类也必须声明为抽象类。抽象方法必须在抽象类的所有子类中被重写。