面向对象---多态

蔚落 2021-09-14 09:20 511阅读 0赞

多态:

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

比如:人:男人,女人

多态的体现:

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

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

  1. public class Demo44 {
  2. public static void main(String[] args){
  3. // Cat1 cat=new Cat1();
  4. // cat.eat();
  5. function(new Cat1());
  6. }
  7. public static void function(Animal1 a){//Animal1 cat=new Cat();父类的引用指向了自己的子类对象。
  8. a.eat();
  9. }
  10. }
  11. abstract class Animal1{
  12. abstract void eat();
  13. }
  14. class Cat1 extends Animal1{
  15. public void eat(){
  16. System.out.println("吃鱼");
  17. }
  18. }
  19. class Dog1 extends Animal1{
  20. public void eat(){
  21. System.out.println("吃骨头");
  22. }
  23. }

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

  1. public class Demo44 {
  2. public static void main(String[] args){
  3. Animal1 cat=new Cat1();//类型提升,向上转型
  4. function(new Cat1());
  5. //如果想要调用猫的特有方法,如何操作?
  6. //强制将父类的引用,转成子类类型。
  7. Cat1 cat1=(Cat1) cat;
  8. cat1.catchMouse();
  9. }
  10. public static void function(Animal1 a){//Animal1 cat=new Cat();
  11. a.eat();
  12. }
  13. }
  14. abstract class Animal1{
  15. abstract void eat();
  16. }
  17. class Cat1 extends Animal1{
  18. public void eat(){
  19. System.out.println("吃鱼");
  20. }
  21. public void catchMouse(){
  22. System.out.println("捉老鼠");
  23. }
  24. }

下面的操作是错误的,就是经父类对象转成子类类型。
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被转换。

  1. Animal1 a=new Animal1();
  2. Cat1 c=(cat1)a;

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

  1. public class Demo44 {
  2. public static void main(String[] args){
  3. function(new Cat1());
  4. }
  5. public static void function(Animal1 a){//Animal1 cat=new Cat();
  6. a.eat();
  7. if(a instanceof Cat1){//判断a 是否是Cat1 类型的
  8. Cat1 c=(Cat1) a;
  9. c.catchMouse();
  10. }else if(a instanceof Dog1){//判断a 是否是Dog1 类型的
  11. Dog1 d=(Dog1) a;
  12. d.kanjia();
  13. }
  14. }
  15. }
  16. abstract class Animal1{
  17. abstract void eat();
  18. }
  19. class Cat1 extends Animal1{
  20. public void eat(){
  21. System.out.println("吃鱼");
  22. }
  23. public void catchMouse(){
  24. System.out.println("捉老鼠");
  25. }
  26. }
  27. class Dog1 extends Animal1{
  28. public void eat(){
  29. System.out.println("吃骨头");
  30. }
  31. public void kanjia(){
  32. System.out.println("看家");
  33. }
  34. }

输出结果为:

吃鱼

捉老鼠

多态的前提

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

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

多态的好处

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

多态的弊端

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

多态的应用

需求:

1、基础班学生:

学习、睡觉

2、高级版学生

学习、睡觉

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

  1. public class Demo45 {
  2. public static void main(String[] args) {
  3. // BaseStudent bs=new BaseStudent();
  4. // bs.study();
  5. // bs.sleep();
  6. // AdvStudent ad=new AdvStudent();
  7. // ad.study();
  8. // ad.sleep();
  9. doSomething(new BaseStudent());
  10. doSomething(new AdvStudent());
  11. }
  12. public static void doSomething(Student3 s){
  13. s.study();
  14. if(s instanceof BaseStudent){
  15. BaseStudent b=(BaseStudent) s;
  16. s.sleep();
  17. }else if(s instanceof AdvStudent){
  18. AdvStudent ad=(AdvStudent) s;
  19. s.sleep();
  20. }
  21. }
  22. }
  23. abstract class Student3{
  24. public abstract void study();
  25. public abstract void sleep();
  26. }
  27. class BaseStudent extends Student3{
  28. public void study(){
  29. System.out.println("base study");
  30. }
  31. public void sleep(){
  32. System.out.println("lying sleeep");
  33. }
  34. }
  35. class AdvStudent extends Student3{
  36. public void study(){
  37. System.out.println("adv study");
  38. }
  39. public void sleep(){
  40. System.out.println("siting study");
  41. }
  42. }

运行结果如下:

base study
lying sleeep
adv study
siting study

改进的另一种方法:

  1. public class Demo45 {
  2. public static void main(String[] args) {
  3. // BaseStudent bs=new BaseStudent();
  4. // bs.study();
  5. // bs.sleep();
  6. // AdvStudent ad=new AdvStudent();
  7. // ad.study();
  8. // ad.sleep();
  9. DoStudent ds=new DoStudent();
  10. ds.dosome(new BaseStudent());
  11. ds.dosome(new AdvStudent());
  12. }
  13. // public static void doSomething(Student3 s){
  14. // s.study();
  15. // if(s instanceof BaseStudent){
  16. // BaseStudent b=(BaseStudent) s;
  17. // s.sleep();
  18. // }else if(s instanceof AdvStudent){
  19. // AdvStudent ad=(AdvStudent) s;
  20. // s.sleep();
  21. // }
  22. // }
  23. }
  24. class DoStudent{
  25. public void dosome(Student3 stu){
  26. stu.study();
  27. stu.sleep();
  28. }
  29. }
  30. abstract class Student3{
  31. public abstract void study();
  32. public abstract void sleep();
  33. }
  34. class BaseStudent extends Student3{
  35. public void study(){
  36. System.out.println("base study");
  37. }
  38. public void sleep(){
  39. System.out.println("lying sleeep");
  40. }
  41. }
  42. class AdvStudent extends Student3{
  43. public void study(){
  44. System.out.println("adv study");
  45. }
  46. public void sleep(){
  47. System.out.println("siting study");
  48. }
  49. }

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

Center

发表评论

表情:
评论列表 (有 0 条评论,511人围观)

还没有评论,来说两句吧...

相关阅读

    相关 面向对象

    面向对象—多态 定义 实现 原理 1、定义 > 多态可以简单的概括为“一个接口,多种方法”,在程序运行过程中才决定调用的函数,简单的说就是,允许

    相关 面向对象

    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 编译时的多态性: 编译时的多态性是通过重

    相关 面向对象---

    多态: > 可以理解为事物存在的多种体现形态。 > 比如:人:男人,女人 多态的体现: > 父类的引用指向了自己的子类对象。 > > 父类的引用也可以接受自己的对象。