写在前面
我是上学期学的java,平常又不用java写代码。很快就忘记了,结果上设计模式的时候涉及一些java的思想,还有一些语法方法都有所忘记。所以写在这里复习一下,同时也是个备忘。
这里有向上/下转型的使用方法 特点 还有应用的例子
总结
先上干货
- 向上转型
- 父类引用指向子类对象 称之为向上转型 像这样的 Father f=new Son();
- 向上转型子类方法会覆盖父类方法
- 因为向上转型会丢失子类独有方法
- 向下转型
- 向下转型时要先使用向上转型
- 判断是否可以向下转型时 可以用语意来判断 (详情见代码注释)
- 向下转型需要考虑安全性,**如果父类引用的对象是父类本身,或者是其他类。**那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现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