什么是多态
多态是面向对象三大特征中最重要的一种特征,多态可以体现方法层面,方法层面的多态由重载和重写实现;另外多态最重要的体现在变量层面,可以使用一个父类的引用变量指向任何的子类对象,从而实现引用动态绑定机制。
多态中的上转型与下转型
在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法
子类引用的对象转换为父类类型称为向上转型
向下转型的前提是父类对象指向的是子类对象,向下转型只能转型为本类对象。因此只有在继承中才有运用转型的可能。
例:
public class User {
private int userName;
private String pwd;
public User(int userName, String pwd) {
super();
this.userName = userName;
this.pwd = pwd;
}
public int getUserName() {
return userName;
}
public void setUserName(int userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else {
if (obj instanceof User) {
// 下转型
User u = (User) obj;
if (this.userName == u.getUserName() && this.pwd.equals(u.pwd)) {
return true;
}
}
}
return false;
}
public class TestUser {
public static void main(String[] args) {
User u1 = new User(1001, "mima123");
// 上转型
Object u2 = new User(1001, "mima123");
System.out.println(u1.equals(u2));
}
}
此例在重写equals()方法时,先对传进来的对象u2进行了向上转型,之后为了通过对比username与pwd是否相同来判定u1与u2是否相同时对u2进行了向下转型。实际上u2本质上就是User类型,只不过为了实现方法才进行转型。
注意事项
使用多态可以提高程序的可扩展性,多态也称之为动态绑定
可以使用父类引用指向子类对象,但是如果使用子类引用指向父类对象时,操作不当将会导致类型转换异常(java.lang.ClassCastException)