对于初学者来说 java多态性的上转下转特别容易搞不清楚
下面我带来一个简单的例子说明一下
希望对你有所帮助
首先一个父类 封装一个属性:name
并有一个方法say ,参数是 Ainmal类型
public class Animal { private String name; public void say(Animal animal){ System.out.println("汤姆与杰瑞"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }然后我们建两个不同的动物类,都继承Animal
并且都重写say方法
这里注意重写和重载的区别:想要了解请去我博客看上一篇
猫类,自己新建一个属性:gender性别,用于下转
public class Cats extends Animal{ private String gender; public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Cats(){} public Cats(String name,String gender){ this.setName(name); this.gender = gender; } @Override public void say(Animal animal){ //下转 Mouse mouse = (Mouse) animal; System.out.println(getName()+"("+gender+")天天捉不到("+mouse.getGender()+")"+animal.getName()); } }老鼠类,自己新建一个属性:gender性别,用于下转
public class Mouse extends Animal{ private String gender ; public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Mouse(String name,String gender){ this.setName(name); this.gender = gender; } @Override public void say(Animal animal){ //下转 Cats cat = (Cats) animal; System.out.println(getName()+"("+gender+")永远不会被"+animal.getName()+"("+cat.getGender()+")捉到"); } }测试类
public class TestAnimal { public Object method(){ return new Cats(); } public Animal getAnimal(){ /* return new Cats("tom");*/ return new Mouse("杰瑞","男"); } public static void main(String []args){ Animal cat = new Cats("汤姆","男"); Animal mouse = new Mouse("杰瑞","女"); //上转 cat.say(mouse); mouse.say(cat); } }结果:
汤姆(男)天天捉不到(女)杰瑞 杰瑞(女)永远不会被汤姆(男)捉到
下面通过 简单表示一下它们特性
class A{ } class B extends A{ } class C extends B{ } /** * 测试转型 特性 * @author *** * @version 1.0.0 * @createTime 2019-07-24 16:38:36 */ public class Trans { public static void main(String []args){ A a = new A(); B b = new B(); C c = new C(); /* a = b; b = c; a = c; */ A a1 = c;//c上转形成A类 通过了B类 B b1 = (B) a1;//再将A类下转为B类 /* //下转一点要先上转在下 A a2 = b; C c1 = (C) a2;//运行时错误 */ System.out.println("!!!!!!"); } }关键字 instanceOf :判断对象是否属于一个类的实例
我们在Trans下新建一个方法 method();如下
public void method(Animal animal){ if (animal instanceof Cats){ //下转 Cats cat = (Cats) animal; cat.printMsg();//printMsg()方法在父类中并没有 }else if (animal instanceof Mouse){ //下转 Mouse mouse = (Mouse) animal; mouse.show(); } }main()函数中测试
Animal cat = new Cats("Tom","boy");
Animal mouse = new Mouse("Jerry","girl");
trans.method(cat);
trans.method(mouse);
我们简单分析一下:
其中我用父类分别创建了两个子类对象,这里运用下转体现了运行时多态
在method方法体中应用下转
结果:
猫Tomboy 鼠Jerrygirl
