多态通过分离“做什么”和“怎么做”,从另外一个角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建“可扩展的”程序,在项目需要添加新功能时,都可以进行扩充。
向上转型
由于继承关系的存在,对象既可以作为自己本身的类型使用,也可以作为其父类类型使用。这种将某个对象的引用视为对其父类类型引用的做法被称作向上转型(upcasting)。
package Liu;
//Shape接口
interface Shape {
public void erase();
}
//Circle类实现Shape接口
class Circle implements Shape {
public void erase() {
System.out.println("Circle erase");
}
}
//Line类实现Shape接口
class Line implements Shape {
public void erase() {
System.out.println("Line erase");
}
}
//Eraser类
class Eraser {
void cleanBoard(Shape s) {
s.erase();
}
}
//测试类
public class text12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Eraser eraser = new Eraser();
Line l = new Line();
Circle c = new Circle();
eraser.cleanBoard(l);
eraser.cleanBoard(c);
}
}
使用了向上转型 ,无论多少个类实现了Shape接口,都不需要修改Eraser类。
多态允许同一个父类继承下来的子类之间能够表现出彼此的区别…
恰当的使用多态机制能够消除类型之间的耦合关系,允许将对象视为自己本身类型或者其父类类型进行处理。
可以将从父类继承下来的多种子类类型视为同一父类类型进行处理,而同一份代码也就可以毫无差别的运行在这些不同子类类型上。
后期绑定
**将一个方法调用同一个方法主体关联起来被称作绑定。**若在程序执行前进行绑定(由编译器和来链接程序实现)称为前期绑定。在程序执行的过程中进行绑定就称为后期绑定,也叫做动态绑定和运行时绑定,即具有某种机制,以便在运行时能够判断对象的类型,以调用恰当的方法,编译器不知道对象的类型,但是方法调用机制能够找到正确的方法体,并加以调用。
package Liu;
import java.util.Scanner;
//抽象类Device
abstract class Device {
String data;
public abstract void dataread();
}
//继承类Camera
class Camera extends Device {
public void dataread() {
Scanner scanner = new Scanner(System.in);
this.data = scanner.next();
System.out.println("Camera读入数据为" + this.data);
}
}
//继承类MP3
class MP3 extends Device {
public void dataread() {
Scanner scanner = new Scanner(System.in);
this.data = scanner.next();
System.out.println("MP3读入数据为" + this.data);
}
}
//继承类Upan
class Upan extends Device {
public void dataread() {
Scanner scanner = new Scanner(System.in);
this.data = scanner.next();
System.out.println("U盘读入数据为" + this.data);
}
}
//向上转型类USB
class USB {
public void readdata(Device d) {
d.dataread();
}
}
//测试类
public class text12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
USB usb = new USB();
Device c = new Camera(); //上溯造型对象
Device m = new MP3();
Device u = new Upan();
usb.readdata(c);
usb.readdata(m);
usb.readdata(u);
}
}
壁纸.jpg
Camera读入数据为壁纸.jpg
《十年》
MP3读入数据为《十年》
密码学
U盘读入数据为密码学
Java中除了静态方法static和final方法之外,其他所有的方法都是后期绑定,且自动发生。final关键字防止重写该方法,不进行动态绑定。