牢记:父类引用指向子类对象。(而子类引用不能指向父类对象)
分为向上转型和向下转型。
一、向上转型
定义:子类对象转为父类对象。
eg:
package Hcybx;
/**
* 父亲类
*/
public class Father {
public void skill() {
System.out.println("会跳爵士舞");
}
}
package Hcybx;
/**
* 儿子类
*/
public class Son extends Father{
@Override
public void skill() {
System.out.println("会打蓝球");
}
}
package Hcybx;
/**
* 女儿类
*/
public class Daughter extends Father{
@Override
public void skill() {
System.out.println("会唱歌");
}
public void play(){
System.out.println("会弹钢琴");
}
}
package Hcybx;
public class Test {
public static void main(String[] args) {
Father father = new Son();//向上转型
father.skill();
father = new Daughter();
father.skill();
}
}
运行结果:
会打蓝球
会唱歌
Father father= new Son();将子类对象Son转化为父类对象Father。这个时候father这个引用调用的方法是子类方法。
注意
1.向上转型时,father 会遗失除与父类对象共有的其他方法。如本例中女儿类中的 play 方法不再为 father 所有。
如果继续调用就会报错!
2.子类引用不能调用父类对象。
Son son = (Son)new Father();
优点:
使代码简洁,提高系统的扩展性。
二、向下转型
定义:把父类对象转换为子类对象。
eg:
接着上面的例子:
package Hcybx;
public class Test {
public static void main(String[] args) {
Father father = new Son();
Son son = (Son) father;
son.skill();
}
}
运行结果:
会打蓝球
package Hcybx;
public class Test {
public static void main(String[] args) {
Father father = new Son();
Son son = (Son) father;
son.skill();
Daughter daughter = (Daughter) father;
daughter.skill();
}
}
运行结果
儿子不能变为女儿。向下转型只能转型为本类对象。
package Hcybx;
public class Test {
public static void main(String[] args) {
Father father = new Father();
Daughter daughter = (Daughter) father;
daughter.skill();
}
}
运行结果:
father为Father对象,不能被向下转型为任何子类对象。
注意
向下转型的前提是先向上转型。
为了防止异常,我们可以通过instanceof 来防止出现异常。
package Hcybx;
public class Test {
public static void main(String[] args) {
Father father = new Son();
//判断这个父类father引用对象是否为子类Son的对象
if (father instanceof Son) {
Son son = (Son) father;
son.skill();
}
//判断这个父类father引用对象是否为子类Daughter的对象
if (father instanceof Daughter) {
Daughter daughter = (Daughter) father;
daughter.skill();
}
}
}
运行结果:
结论:
1.在引用数据类型中,只有继承关系才能进行类型转换。
2.父类引用可以自动指向子类对象,但只能访问和调用到来自于父类的属性和行为。
3.子类的引用不能指向父类或其它子类对象,就算强转也会导致运行失败并抛出ClassCastException。
4.把父类引用赋给子类引用,语法上必须使用强制类型转换,要想运行成功还必须保证父类引用指向的对象一定是该子类对象,(最好使用instance判断后,再强转)。
三、多态
定义:多态是同一个行为具有多个不同表现形式或形态的能力。
多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象
多态的优点是提高了程序的扩展性。