目录
多态概述
强制类型转换
向上转型和向下转型
实例演示
多态的应用环境
抽象类
小结
多态概述
Java有三大特性:封装、继承和多态。
? 那么什么是多态呢?所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
多态意味着父类型的变量可以引用子类型的对象。
?继承关系使一个子类能继承父类的特征,并且附加一些新特征。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来不成立。例如:每个圆都是一个几何对象,但并非每个几何对象都是圆。因此,总可以将子类的实例传给需要父类型的参数。 ?
强制类型转换
在了解多态之前,让我们先了解一下类型转换,因为多态本身是一种向上转型。
- 向上转型不要强制转型
- 父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定
- 向上转型后父类引用不能调用子类自己的方法
double Steve_speed = 233.33;
int now_Steve_speed = (int) Steve_speed;
向上转型和向下转型
public class I_am_AaaaT {
public void sleep() {
System.out.println("Now is moonlight");
}
public static void main(String[] args) {
AaaaT m = new AaaaT();
m.sleep();
AaaaT h = new AaaaT();// (1)向上转型
h.sleep(); // (2)动态绑定
// h.speak(); // (3)此方法不能编译,报错说I_am_AaaaT类没有此方法
// // [1]向下转型
// AaaaT m2 = new AaaaT();
// I_am_AaaaT h2 = m2;
// m2 = (AaaaT) h2;
// m2.speak();
//
// // [2]向下转型:失败
// I_am_AaaaT h3 = new I_am_AaaaT();
// AaaaT m3 = (AaaaT)h3;
// m3.speak(); //此时会出现运行时错误,所以可以用instanceOF判断
//
// // [3]向下转型:类型防护
// I_am_AaaaT h4 = new I_am_AaaaT();
// if (h4 instanceof AaaaT){ // 因为h4不是AaaaT的实例,所以不执行if内部代码
// AaaaT m4 = (AaaaT)h4;
// m4.speak();
// }
}
}
class Steve extends I_am_AaaaT {
@Override
public void sleep() {
System.out.println("AaaaT sleep.");
}
public void speak() {
System.out.println("I am AaaaT.");
}
}
class Alex extends I_am_AaaaT {
@Override
public void sleep() {
System.out.println("CcccT sleep.");
}
public void speak() {
System.out.println("I am CcccT.");
}
}
在这里还可以用 instanceof 判断类型
实例演示
我们平常讲的Java的三大特性之多态多指多态的动态绑定,有三个必要条件:
多态的应用环境
多态:基类型对象访问派生类重写的方法
- 循环调用基类对象,访问不同派生类方法
- 自定义函数,实参是派生类,行参是基类
- 一般不单独使用,和抽象类等配合使用
抽象类
抽象方法是出现在基类中的一种方法,但要求在派生类中被重写。 ?一个抽象方法只有方法头,没有方法主体 包含抽象方法的类就会自动办成抽象类,隐刺必须以abstract关键字声明。 抽象方法会被用来确保派生类会实现这个方法 若类含有抽象方法,则类必须以abstract关键字声明为抽象类
eg.public abstract class
抽象类可以含零或多个普通方法,也可以含零或多个抽象方法 不论抽象类是否含有抽象方法,其都不允许实例化,即不能创建抽象类的对象,因为其描述的是抽象概念。它只能作为其他类的基类。 若父类是抽象类,且子类不想成为抽象类,则子类必须将父类中所有抽象方法重写为带方法体的普通方法,否则子类仍必须是抽象类。 ?
小结
?多态虽然对于初学者来说,有一些难以理解,但其特性动态绑定在实际项目中非常有用,能减少很多繁杂的代码,减轻工作量的同时,其灵活性也大大提高了代码的扩展性,能够避免不同子类的差异,简化程序,使我们的程序更加通用。
在面向对象编程的时候,我们遇到的对象通常都会具有多种特性,我们想要实现一个对象的编程过程,就需要用到Java的三大特性。如果说,封装是创造了一个初具人形的发条人偶,继承则是给它装上了工具,而多态则为这个人偶赋予了独有的灵魂和思想。
|