多态(向下转型)的特点和好处

向下转型 Father f = new  Child();

特点:     

1.调用方法 f.function: 

先在创建的Child对象找这个方法;如有找到(即改写了父类的f.function),则用改写后Child的方法; 如果Child类没有改写父类的f.function,才调用父类的方法这就是方法的动态绑定。


public class Father {   
   
  protected String name="父亲属性";   
     
  public void method() {   
    System.out.println("父类方法,对象类型:" + this.getClass());   
  }   
}   
     
public class Son extends Father {   
  protected String name="儿子属性";   
     
  public void method() {   
    System.out.println("子类方法,对象类型:" + this.getClass());   
  }   
     
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    System.out.println("调用的成员:"+sample.name);   
  }   
}   
 结论,调用的成员为父亲的属性。

2.成员变量没有动态绑定,所以成员变量的初始化和读取常用get和set函数

public class Father {   
  protected String name = "父亲属性";   
  public String getName() {   
    return name;   
  }   
  public void method() {   
    System.out.println("父类方法,对象类型:" + this.getClass());   
  }   
}   
     
public class Son extends Father {   
  protected String name="儿子属性";   
     
  public String getName() {   
    return name;   
  }   
     
  public void method() {   
    System.out.println("子类方法,对象类型:" + this.getClass());   
  }   
     
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    System.out.println("调用的成员:"+sample.getName());   
  }   
}   

结果:调用的是儿子的属性


多态的好处:


public class Human {
public void sleep() {
System.out.println("Human sleep..");
}
}
class Male extends Human {
@Override
public void sleep() {
System.out.println("Male sleep..");
}
}
class Female extends Human {
@Override
public void sleep() {
System.out.println("Female sleep..");
}
}


public class Main{

public static void main(String[] args) {
dosleep(new Male());
dosleep(new Female());
}

public static void dosleep(Human h) {
h.sleep();
}
}
 

----------------------------------------------------------------------------------------------------------

这段代码体现了多态的优势:    

public static void dosleep(Human h) {
        h.sleep();
    }

这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。

所以的子类对象都可以通过这一段代码调用dosleep函数块这样使代码变得简洁。不然的话,

如果dosleep以子类对象为参数,则有多少个子类就需要写多少个dosleep函数。这也体现了JAVA的抽象编程思想。






猜你喜欢

转载自blog.csdn.net/fle123/article/details/78358131
今日推荐