面向对象---多态

来源:互联网 发布:如何自学软件测试 编辑:程序博客网 时间:2024/06/05 05:56

多态:

可以理解为事物存在的多种体现形态。

比如:人:男人,女人

多态的体现:

父类的引用指向了自己的子类对象。

父类的引用也可以接受自己的对象


public class Demo44 {public static void main(String[] args){//Cat1 cat=new Cat1();//cat.eat();function(new Cat1());}public static void function(Animal1 a){//Animal1 cat=new Cat();父类的引用指向了自己的子类对象。a.eat();}}abstract class Animal1{abstract void eat();}class Cat1 extends Animal1{public void eat(){System.out.println("吃鱼");}}class Dog1 extends Animal1{public void eat(){System.out.println("吃骨头");}}

//如果想要调用猫的特有方法,如何操作?
//强制将父类的引用,转成子类类型。

public class Demo44 {public static void main(String[] args){Animal1  cat=new Cat1();//类型提升,向上转型function(new Cat1());//如果想要调用猫的特有方法,如何操作?//强制将父类的引用,转成子类类型。Cat1 cat1=(Cat1) cat;cat1.catchMouse();}public static void function(Animal1 a){//Animal1 cat=new Cat();a.eat();}}abstract class Animal1{abstract void eat();}class Cat1 extends Animal1{public void eat(){System.out.println("吃鱼");}public void catchMouse(){System.out.println("捉老鼠");}}
下面的操作是错误的,就是经父类对象转成子类类型。
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被转换。

Animal1 a=new Animal1();Cat1 c=(cat1)a;

注意:自始至终多态都是子类对象在做着变化。


public class Demo44 {public static void main(String[] args){function(new Cat1());}public static void function(Animal1 a){//Animal1 cat=new Cat();a.eat();if(a instanceof Cat1){//判断a 是否是Cat1 类型的Cat1 c=(Cat1) a;c.catchMouse();}else if(a instanceof Dog1){//判断a 是否是Dog1 类型的Dog1 d=(Dog1) a;d.kanjia();}}}abstract class Animal1{abstract void eat();}class Cat1 extends Animal1{public void eat(){System.out.println("吃鱼");}public void catchMouse(){System.out.println("捉老鼠");}}class Dog1 extends Animal1{public void eat(){System.out.println("吃骨头");}public void kanjia(){System.out.println("看家");}}

输出结果为:

吃鱼

捉老鼠


多态的前提

必须是类与类之间有关系,要么继承,要么实现。

通常还有一个前提,存在覆盖。

多态的好处

多态的出现大大的提高了代码的扩展性。

多态的弊端

提高了扩展性,但是只能使用父类的引用访问父类中的成员。

多态的应用

需求:

1、基础班学生:

学习、睡觉

2、高级版学生

学习、睡觉

可以将这两类事物进行抽取。

public class Demo45 {public static void main(String[] args) {//BaseStudent bs=new BaseStudent();//bs.study();//bs.sleep();//AdvStudent ad=new AdvStudent();//ad.study();//ad.sleep();doSomething(new BaseStudent());doSomething(new AdvStudent());}public static void doSomething(Student3 s){s.study();if(s instanceof BaseStudent){BaseStudent b=(BaseStudent) s;s.sleep();}else if(s instanceof AdvStudent){AdvStudent ad=(AdvStudent) s;s.sleep();}}}abstract class Student3{public abstract void study();public abstract void sleep();}class BaseStudent extends Student3{public void study(){System.out.println("base study");}public void sleep(){System.out.println("lying sleeep");}}class AdvStudent extends Student3{public void study(){System.out.println("adv study");}public void sleep(){System.out.println("siting study");}}

运行结果如下:

base study
lying sleeep
adv study
siting study

改进的另一种方法:

public class Demo45 {public static void main(String[] args) {//BaseStudent bs=new BaseStudent();//bs.study();//bs.sleep();//AdvStudent ad=new AdvStudent();//ad.study();//ad.sleep();DoStudent ds=new DoStudent();ds.dosome(new BaseStudent());ds.dosome(new AdvStudent());}//public static void doSomething(Student3 s){//s.study();//if(s instanceof BaseStudent){//BaseStudent b=(BaseStudent) s;//s.sleep();//}else if(s instanceof AdvStudent){//AdvStudent ad=(AdvStudent) s;//s.sleep();//}//}}class DoStudent{public void dosome(Student3 stu){stu.study();stu.sleep();}}abstract class Student3{public abstract void study();public abstract void sleep();}class BaseStudent extends Student3{public void study(){System.out.println("base study");}public void sleep(){System.out.println("lying sleeep");}}class AdvStudent extends Student3{public void study(){System.out.println("adv study");}public void sleep(){System.out.println("siting study");}}



多态的出现代码中的特点(多态使用的注意事项)










原创粉丝点击