十二、Java转型问题+多态

牢记:父类引用指向子类对象。(而子类引用不能指向父类对象)
分为向上转型和向下转型。

一、向上转型

定义:子类对象转为父类对象。
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判断后,再强转)。

三、多态

定义:多态是同一个行为具有多个不同表现形式或形态的能力。

多态存在的三个必要条件:
  • 继承
  • 重写
  • 父类引用指向子类对象

多态的优点是提高了程序的扩展性。

发布了46 篇原创文章 · 获赞 41 · 访问量 8447

猜你喜欢

转载自blog.csdn.net/weixin_42635052/article/details/89814009
今日推荐