JAVA 面向对象 多态

发布于 2021-06-25 12:29:17 字数 2590 浏览 1074 评论 0

一、定义:某一类事物的多种存在形态。

例:动物中猫,狗。 猫这个对象对应的类型是猫类型(猫 x = new 猫()) 同时猫也是动物的一种,也可以把猫称为动物。(动物 y = new 动物()) 动物是猫和狗具体事物中抽取出来的父类型。 父类型引用指向了子类对象。

二、多态的好处

提高代码的扩展性,前期定义的代码可以使用后期的内容。

abstract class Animal{
  abstract eat(){}
}

class Cat extends Animal{
  public void eat(){
    System.put.println("cat eat");
  }

  public void catchMouse(){
    System.put.println("catch mouse");
  }
}

class DuTaiDemo{
  public static void main(String[] args){
    Animal c1 = new Cat();//状态一
    Cat c2 = new Cat();//状态二
  }
}

三、多态的弊端

前期定义的内容不能使用后期子类的特有内容

四、转型

Animal a = new Cat(); // 自动类型提升,猫对象提升了动物类型。但是特有功能无法访问
// 作用就是可以限制对特有功能的访问。

a.eat(); // 只能调用Animal中存在的方法eat,不能调用catchMouse

// 如果还想用具体猫的特有功能,你可以将该对象进行向下转型。
Cat c = (Cat)a;
c.eat();
c.catchMouse();

注意:对于转型,自始自终都是子类对象在做着类型的变化

Animal a = new Animal();
Cat c = (Cat)a;//此时就不能转化

五、类型判断-instanceof

public static void method(Animal a){
  a.eat();
  if(a instanceof Cat){//instanceof用于判断对象的具体类型,只能用于引用数据类型判断
             //通常在向下转型前用于健壮性的判断。
    Cat c = (Cat)a;
    c.catchMouse();
  }else if(a instanceof Dog){
    Dog d = (Dog)a;
    d.lookHome();
  }
}

六、多台的特点

成员变量

只看引用变量所属的类(简单说:编译和运行都参考左边) 编译时:参考引用型变量所属的类中是否有调用的成员变量,有,编译通过,没有,编译失败 运行时:参考引用型变量所属的类中是否有调用的成员变量,并运行该类中的成员变量。

class Fu{
  int num = 3;
}

class Zi extends Fu{
  int num = 4;
}

class DuoTaiDemo{
  public static void main(){
    Fu f = new Zi();
    System.out.println(f.num);//3
  }
}

成员函数

编译时:参考引用型变量所属的类中是否有调用的函数,有,编译通过,没有,编译失败 运行时:参考的是对象所属的类中是否有调用的函数。 简单说:编译看左边,运行看右边。

class Fu{
  void show(){
    System.out.println("Fu show");
  }
}

class Zi extends Fu{
  void show(){
    System.out.println("Zi show")
  }

}

class DuoTaiDemo{
  public static void main(){
    Fu f = new Zi();
    f.show();//Zi show
  }
}

静态函数

编译时:参考引用型变量所属的类中是否有调用的静态方法。 运行时:参考引用型变量所属的类中是否有调用的静态方法。 简单说:你编译和运行都看左边

其实对于静态方法,是不需要对象的,直接用类名调用即可。

class Fu{
  void show(){
    System.out.println("Fu show");
  }

  static void method(){
    System.out.println("Fu static method");
  }
}

class Zi extends Fu{
  void show(){
    System.out.println("Zi show")
  }

  static void method(){
    System.out.println("Zi static method");
  }
}

class DuoTaiDemo{
  public static void main(){
    Fu f = new Zi();
    f.method();//Fu static method
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

留蓝

文章 0 评论 0

18790681156

文章 0 评论 0

zach7772

文章 0 评论 0

Wini

文章 0 评论 0

ayeshaaroy

文章 0 评论 0

初雪

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文