面向对象---多态
程序员文章站
2024-03-17 16:04:22
...
多态:
可以理解为事物存在的多种体现形态。
比如:人:男人,女人
多态的体现:
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的对象。
//如果想要调用猫的特有方法,如何操作?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"); } }
多态的出现代码中的特点(多态使用的注意事项)
上一篇: 基于文本界面的客户信息管理软件
推荐阅读
-
Python学习(十四)——面向对象
-
JAVA面向对象程序设计
-
面向对象---多态
-
js arguments对象 博客分类: javascript javascript
-
js arguments对象 博客分类: javascript javascript
-
新手学java(6)- java内存优化 博客分类: 新手学java javajava性能优化java内存创建对象
-
thymeleaf常用工具对象 博客分类: thymeleaf thymeleaf
-
Java对象序列化和反序列化工具类 博客分类: java Java 对象序列化 反序列化
-
获取对象里面任意属性值
-
UML之死 博客分类: UML UML死建模面向对象系统架构设计师