java复习之向上转型,向下转型

写在前面

我是上学期学的java,平常又不用java写代码。很快就忘记了,结果上设计模式的时候涉及一些java的思想,还有一些语法方法都有所忘记。所以写在这里复习一下,同时也是个备忘。
这里有向上/下转型的使用方法 特点 还有应用的例子


总结

先上干货

  • 向上转型
  1. 父类引用指向子类对象 称之为向上转型 像这样的 Father f=new Son();
  2. 向上转型子类方法会覆盖父类方法
  3. 因为向上转型会丢失子类独有方法
  • 向下转型
  1. 向下转型时要先使用向上转型
  2. 判断是否可以向下转型时 可以用语意来判断 (详情见代码注释)
  3. 向下转型需要考虑安全性,**如果父类引用的对象是父类本身,或者是其他类。**那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用 instanceof 来避免出错此类错误即能否向下转型,只有先经过向上转型的对象才能继续向下转型。
代码注释有很详细的解释
 //Human 拥有说的方法 是Female Male 的父类
public  class Human
{
	 public void speak()
	 {
		 System.out.println("I am a human");
	 }
}

//Male 拥有吃和说两个方法
public class Male extends Human
{
	 public void speak()
	 {
		 System.out.println("I am a Male");
	 }
	 public void eat()
	 {
		 System.out.println("Male eat");
	 }
}

//Female  拥有吃和说两个方法
public class Female extends Human
{
	 public void speak()
	 {
		 System.out.println("I am a female");
	 }
   	 public void eat()
	 {
		 System.out.println("Female eat");
	 }
}

public class Client
{
	public static void eat(Human a)
	{
		if (a instanceof Female) //判断 a到底是男人还是女人
		{
			Female f = (Female) a;
			f.eat();
		}
		if (a instanceof Male)
		{
			Male m = (Male) a;
			m.eat();
		}
	}

	public static void main(String args[])
	{
		// 向上转型例子
		Human f = new Female(); // 向上转型 父类引用指向子类对象
		Human m = new Male();   // 向上转型
		f.speak();              // 输出 I am a female 因为向上转型子类方法会覆盖父类方法
		m.speak();              // 输出 I am a male 因为向上转型子类方法会覆盖父类方法
				                // f.eat(); 报错 因为向上转型会丢失子类独有方法
		System.out.println("我是分隔符-------------------------------");
		

		// 向上转型应用
		Human humans[] = { new Female(), new Male(), new Male() };
		for (Human i : humans)
		{
			i.speak();
		}
		System.out.println("我是分隔符-------------------------------");
		
		
		
		// 向下转型
		Male m2 = (Male) m;
		m2.speak();
		// Male m3=(Male)f;
		// m3.speak(); 报错 Female cannot be cast to Male 女人不是男人,所以无法被强制转换

		// Human h=new Human();
		// Male m4=(Male) h;
		// m4.speak(); 报错Human cannot be cast to Male 人可能是男人也可能是女人 所以不能强制转换
		System.out.println("我是分隔符-------------------------------");

		// 向下转型应用
		eat(new Female());
		eat(new Male());

	}
}

//输出
I am a female
I am a Male
我是分隔符-------------------------------
I am a female
I am a Male
I am a Male
我是分隔符-------------------------------
I am a Male
我是分隔符-------------------------------
Female eat
Male eat

参考博客
https://blog.csdn.net/qq_31655965/article/details/54746235
https://www.cnblogs.com/buptldf/p/4959480.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值