java之多态的使用
首先,什么是多态?我们应该从什么角度来理解多态?其实,我们不妨把多态理解成一种事物的多种存在形态,比如,猫和狗都可以变成动物,而动物又可以变成猫和狗。
为了充分理解多态,我们可以从以下这几个方面来理解多态。
第一、从多态的体现方面:我们使用多态的时候,创建的是父类的引用,开辟的是子类的空间,由于没有开辟父类的空间,所以是父类的引用指向子类对象,并不是真正的父类自己创建了对象,而且父类对象的引用还可以作为函数参数来接收子类对象哦!
第二、多态实现的前提:必须是类与类之间要有关系,要么继承,要么实现,存在覆盖,其实就是有抽象函数。
第三、从多态的好处:大大提高程序的可拓展性
第四、多态的应用:1.父类对象的引用指向子类对象,其实本质上是一个向上转型,就像int转成double一样,儿子穿了一身爸爸的衣服,扮成了爸爸。2.但变成了爸爸之后,只能使用爸爸特有的技能,儿子怎么能够使用自己本身的技能呢?这时候就需要向下转型,脱下伪装,将父类对象的引用强转成子类类型,就可以使用子类特有的技能了。
第五、多态的弊端:提高了拓展性,但是只能使用父类的引用访问父类的成员。
多态:可以理解为事物存在的多种体现形态。
人:男人,女人动物:猫,狗。猫 x = new 猫();动物 x = new 猫();
-
多态的体现
父类的引用指向了自己的子类对象。 父类的引用也可以接收自己的子类对象。 -
多态的前提
必须是类与类之间有关系。要么继承,要么实现。 通常还有一个前提:存在覆盖。 -
多态的好处
多态的出现大大的提高程序的扩展性。 -
多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。 -
多态的应用
/* 动物, 猫,狗。 */ abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void kanJia() { System.out.println("看家"); } } class Pig extends Animal { public void eat() { System.out.println("饲料"); } public void gongDi() { System.out.println("拱地"); } } //----------------------------------------- class DuoTaiDemo { public static void main(String[] args) { //Cat c = new Cat(); //c.eat(); //Dog d = new Dog(); //d.eat(); //Cat c = new Cat(); /* Cat c1 = new Cat(); function(c1); function(new Dog()); function(new Pig()); */ //Animal c = new Cat(); //c.eat(); function(new Cat()); function(new Dog()); function(new Pig()); } public static void function(Animal a) { //Animal a = new Cat(); a.eat(); //a.catchMouse(); } /* public static void function(Cat c)// { c.eat(); } public static void function(Dog d) { d.eat(); } public static void function(Pig p) { p.eat(); } */ }
多态:可以理解为事物存在的多种体现形态。
人:男人,女人动物:猫,狗。猫 x = new 猫();动物 x = new 猫();
- 多态的体现 父类的引用指向了自己的子类对象。 父类的引用也可以接收自己的子类对象。
- 多态的前提 必须是类与类之间有关系。要么继承,要么实现。 通常还有一个前提:存在覆盖。
- 多态的好处 多态的出现大大的提高程序的扩展性。
- 多态的弊端: 虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
- 多态的应用
- 多态的出现代码中的特点(多态使用的注意事项)
第二个问题:如何使用子类特有方法。
/* 动物, 猫,狗。 */ class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void kanJia() { System.out.println("看家"); } } class Pig extends Animal { public void eat() { System.out.println("饲料"); } public void gongDi() { System.out.println("拱地"); } } //----------------------------------------- class DuoTaiDemo2 { public static void main(String[] args) { //Animal a = new Cat();//类型提升。 向上转型。 //a.eat(); //如果想要调用猫的特有方法时,如何操作? //强制将父类的引用。转成子类类型。向下转型。 ///Cat c = (Cat)a; //c.catchMouse(); //千万不要出现这样的操作,就是将父类对象转成子类类型。 //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。 //多态自始至终都是子类对象在做着变化。 // Animal a = new Animal(); // Cat c = (Cat)a; /* 毕姥爷 x = new 毕老师(); x.讲课(); 毕老师 y = (毕老师)x; y.看电影(); */ function(new Dog()); function(new Cat()); } public static void function(Animal a) { //Animal a = new Cat(); a.eat(); /* if(a instanceof Animal) { System.out.println("haha"); } else */ if(a instanceof Cat) { Cat c = (Cat)a; c.catchMouse(); } else if(a instanceof Dog) { Dog c = (Dog)a; c.kanJia(); } /* instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型) */ } }