多态:
不同环境下的多种形态,这句话很抽象,例如:”山上有两个老虎打架”,老虎就是一个类,如果在东北,这里的老虎就是东北虎,如果是在华南,这里老虎就指华南虎。如果老虎是父类,东北虎和华南虎都是老虎的子类,那么从面向对象的角度出发,华南虎的对象也属于老虎,这时即调用老虎打架的方法,那么具体的打架的对象就是华南虎对象。
多态在面向对象程序设计中,就是把子类的对象赋值给父类,用父类的引用调用方法的时候,具体执行方法的是子类的对象。
- 多态的优点:
1.多态可以增强程序的可扩展性以及维护性。
2.使得代码更加简洁,结构更加清晰。
- 多态的语法:
父类名 父类对象名=new 子类名([参数列表]); |
比如现在要计算多个图像的面积,包括圆形,矩形等,但是每一个图形的计算方式有不同,我们可以使用继承来实现。
1,定义一个Shape类
package com.bxit; public class Shape { /** * 计算图形的面积的方法 * @return */ public double area(){ System.out.println("父类中的方法"); return 0; } } |
2.定义两个图形类Cycle和Square,并继承Shape类,重写Shape类中的area()方法
package com.bxit; /** * 圆形 * @author QJ * */ public class Cycle extends Sharp{ private double r;//半径 public static final double PI=3.14;//π public double getR() { return r; } public void setR(double r) { this.r = r; } public Cycle(double r) { this.r=r; } /** * 重写父类中的计算面积的方法 */ @Override public double area(){ double area=PI*r*r; return area; } } |
package com.bxit; //长方形 public class Square extends Sharp{ private double chang; private double kuan; public double getChang() { return chang; } public void setChang(double chang) { this.chang = chang; } public double getKuan() { return kuan; } public void setKuan(double kuan) { this.kuan = kuan; } public Square(double chang, double kuan) { super(); this.chang = chang; this.kuan = kuan; } //重写父类中的计算面积的方法 @Override public double area() { double area=chang*kuan; return area; } } |
3,编写测试类
package com.bxit; //多态 public class Test { /** * 多态:不同环境下面的多种形态。 * 将子类的引用(内存地址)赋值给父类对象, * 使用父类对象调用方法的时候其实调用的是子类重写后 * 或者继承过来的父类的方法的方法。 */ //计算图形的面积 public static void main(String[] args) { //创建子类的对象并将子类的对象赋值给父类(多态) Sharp sharp=new Cycle(5); double area=sharp.area(); System.out.println(area); Sharp sharp2=new Square(4, 5); double area1=sharp2.area(); System.out.println(area1); } } |
注意:上面的例子中,红色字体的部分就是把子类的对象赋值给父类的引用,当调用父类的方法的时候,调用的是具体的子类的方法。各个子类完成的求面积的方法不同,因此需要在子类中对area方法进行重写(Override)
- 多态的使用:
一般做法:写一个方法,它只接受父类作为参数,编写的代码只和父类打交道,调用这个方法的时候,实例化不同子类的对象(new一个对象)。
具体为:
- 子类重写父类的方法。
- 把父类类型作为参数的类型,该父类以及子类对象作为参数传入。
- 运行的时候,根据实际创建爱你的对象类型动态的决定使用那个方法。
在运行时,java虚拟机会根据实际创建的对象类型动态决定使用那个方法,一般将这称之为动态绑定。
例如:课件中的小男孩养宠物就是一个很典型的多态使用实例。
instanceof:
Instanceof是Java中的关键字,用来判断一个对象是否是某一个类的对象。
- 语法:
对象名 instanceof 类名
判断该对象是否属于某一个类的对象,如果属于则返回true,否则返回false。
在使用Instanceof时,对象的类型必须和Instanceof后面的参数所指定的类在继承上有上下级的关系,结果才会为true.
例如:
if(sharp2 instanceof Cycle){ System.out.println("是圆形"); }else if(sharp2 instanceof Square){ System.out.println("是长方形"); }else{ System.out.println("未知图形"); } |
说明:
子类对象赋值给父类的引用时多态的表现形式,也叫做向上转型。
相反,将父类的对象赋值给子类的,首先需要强制类型转换,类之间的强制类型转换的方法与前面学习的强制类型转换方法一致,我们将这种强转叫做向下转型。
向下转型的语法:
子类名 子类对象=(子类名)父类的对象;
例如:
Pet p2=new Cat("小黑"); //向下转型(必须要进行强制类型转换) /** * 向下转换的语法: * 子类名 子类对象=(子类名)父类的对象; */ Cat cat=(Cat) p2; cat.pa(); |
注意:当调用子类中特有的方法(父类中没有的方法),必须要使用子类的对象去调用。