写在前面

我是上学期学的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