向下转型: Father f = new Child();
特点:
1.调用方法 f.function:
先在创建的Child对象找这个方法;如有找到(即改写了父类的f.function),则用改写后Child的方法; 如果Child类没有改写父类的f.function,才调用父类的方法这就是方法的动态绑定。
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的抽象编程思想。