1.多态的定义
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
总的来说:多态性指基类型的引用对象指向派生类,指采用多种形式的能力;
在Java中, 引用变量可以是多态的, 即它可以存放不同类对象的地址,只要这些类是它声明的类的派生类即可。
2.实例
向上转型
1.向上转型
不要强制转型
2.
父类引用指向的或者调用的方法是子类的方法
,
这个叫动态绑定
3.
向上转型后父类引用不能调用
子类自己的方法,
public class triangle {
public void printArea() {
System.out.println("triangle 's area = ");
}
public static void main(String[] args) {
isoscelesTriangle i = new isoscelesTriangle();
i.printArea();
triangle t = new isoscelesTriangle();// (1)向上转型
t.printArea(); // (2)动态绑定
//t. perimeter(); (3)此方法不能编译,报错说trangle类没有此方法
}
}
class isoscelesTriangle extends triangle {
@Override
public void printArea() {
System.out.println("triangle 's area = ");
}
}
向下转型
public class trangle {
public void printArea() {
System.out.println("trangle 's area = ");
}
public static void main(String[] args) {
// (1)向上转型
isoscelesTriangle i1 = new isoscelesTriangle();
trangle t1 = i1;
t1.printArea();
//t1.printPerimeter(); // 此时需要向下转型,否则不能调用printPerimeter方法。
// // (2)向下转型
// trangle t2 = new isoscelesTriangle();
// trangle t2 = i2;
// i2 = (isoscelesTriangle) t2;
// t2.printPerimeter();
// // (3)向下转型:失败
// trangle t3 = new trangle();
// isoscelesTriangle i3 = (isoscelesTriangle)t3;
// t3.printPerimeter(); //此时会出现运行时错误,所以可以用instanceOF判断
//
// // (4)向下转型:类型防护
// trangle t4 = new trangle();
// if (t4 instanceof isoscelesTriangle){
// //因为t4不是isoscelesTriangle的实例,所以不执行if内部代码
// isoscelesTriangle i4 = (isoscelesTriangle)t4;
// t4.printPerimeter();
// }
}
}
class isoscelesTriangle extends trangle {
@Override
public void printArea() {
System.out.println("trangle 's area = ");
}
public void printPerimeter() {
System.out.println("trangle 's perimeter = ");
}
}
基类型对象访问派生类重写的方法
public static void main(String[] args) {
GradedActivity[] tests = new GradedActivity[3];
// 第一次考试采用五级计分制,考了75
tests[0] = new GradedActivity();
tests[0].setScore(75);
// 第二次考试采用二级计分制(P或者F)。总共20题,每题分值相同,考生答错5题。
// 通过的最低分数线是60分
tests[1] = new PassFailExam(20, 5, 60);
// 第三次是期末考试也采用五级计分制. 总共50题,每题分值相同,考试答错7题
tests[2] = new FinalExam(50, 7);
// 显示每次考试的分数和等级
for(int i=0; i<tests.length; i++){
showValue(tests[i]);
}
}
public static void showValue(GradedActivity exam){
System.out.println("Score: " + exam.getScore()+ "\t" +
"Grade: " + exam.getGrade());
}
3.使用
前提:多态对象把自己看做是父类类型
- 成员变量: 使用的是父类的
- 成员方法: 由于存在重写现象,所以使用的是子类的
- 静态成员: 随着类的加载而加载,谁调用就返回谁的
4.总结
多态指使用父类对象的地方都可以使用子类的对象,多态意味着父类型的变量可以引用子类型的对象。多态的好处是多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法;提高了程序的可扩展性和可维护性。