多态性简介
多态性是面向对象的第三大特征,多态是继承扩展概念,可以实现父子相互转换处理。在Java中,多态有两种实现模式:
·方法的多态性:
a.方法的重载:同一个方法名称可以根据传入的参数的类型或个数的不同实现不同功能的执行;
b.方法的覆写:同一个方法可能根据使用子类的不同要求去不同的实现;
·对象多态性:
a.对象向上转型:父类 父类实列 = 子类实例——自动转换;
b.对象向下转型:子类 子类实例 =(子类)父类实例——强制转换。
对象向上转型(实现接收或返回参数的统一性)
对象转型属于多态性,这一特性必须在继承性基础上实现。
例子:观察向上转型代码
class Data{ //父类
public void connect(){
System.out.println("1234567890");
}
}
class Day extends Data{ //子类继承
public void connect(){ //覆写方法
System.out.println("1234");
}
}
public class App2 {
public static void main(String[] args){
Data a=new Day();//向上转型,原为:Day a=new Day();
a.connect();
}
}
输出结果:1234
例子:观察一个代码,说明向上转型的主要作用
class Data{ //父类日期类
public void connect(){
System.out.println("2016年12月");
}
}
class Year extends Data{ //子类1年类
public void connect(){
System.out.println("2019年"); //方法覆写
}
}
class Month extends Data{ //子类2月类
public void connect(){
System.out.println("10月 ");
}
}
public class App2 { //主类
public static void main(String[] args){
fun(new Year());//Year a=new Year();匿名对象向上转型
fun(new Month());//Month b=new Bata();匿名对象向上转型
}
public static void fun(Data a){ //不管传递那个子类都可以一个参数接受
a.connect();
}
//**************************重载实现******************
/*
public static void fun(Year a){ //不管传递那个子类都可以一个参数接受
a.connect();
}
public static void fun(Month a){ //不管传递那个子类都可以一个参数接受
a.connect();
}
*/
}
说明:
向上转型的主要特点在于可以对参数进行统一设计。
观察实例化的是哪一个子类,方法有没有经过覆写。如果覆写,调用的方法就是覆写以后的。
为什么不使用方法重载?
如果有一个子类调用就要使用一次重载,程序长度大大加大,在后期维护过程中,工作量也很多。
对象向下转型
向下转型的主要特点在于需要使用到一些子类自己特殊的处理。
例子:实现向下转型
class Person{
public void print(){
System.out.println("吃饭、睡觉、学习、工作...");
}
}
class Per extends Person{
public String fly(){
return "飞翔、";
}
public String wound(){
return "能打";
}
}
public class App2 {
public static void main(String[] args){
System.out.println("超人伪装成正常人...........");
Person a=new Per();//向上转型
a.print();
//将普通人a变成超人
System.out.println("超人变身以后.........");
Per b=(Per) a;//向下转型
b.print();
System.out.print(b.fly());
System.out.println(b.wound());
}
}
输出结果:
超人伪装成正常人…
吃饭、睡觉、学习、工作…
超人变身以后…
吃饭、睡觉、学习、工作…
飞翔、能打
注意:向上转型描述公共特征,向下转型描述私有特殊功能,但是向下转型并不安全。因为在进行向下转型之前一定要进行向上转型。
例子:错误示范
其余部分与上例相同
System.out.println("超人伪装成正常人...........");
Person a=new Person();//不转型
a.print();
System.out.println("超人变身以后.........");
Per b=(Per) a;//向下转型
b.print();
System.out.print(b.fly());
System.out.println(b.wound());
}
输出结果:
超人伪装成正常人…
吃饭、睡觉、学习、工作…
超人变身以后…
异常:Exception in thread “main” java.lang.ClassCastException: Person cannot be cast to Per
超人伪装成正常人(先向上转型),当遇到危险变身超人(后向下转型);
正常人伪装成超人变身(直接向下转型)