zoukankan      html  css  js  c++  java
  • 面向对象三大特征之多态——Java笔记(七)

    多态:

        同一个实体同时具有多种形式
        编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定
        如果编译时类型和运行时类型不同,就出现多态
    例:
     1    class Preson{
     2 }
     3    class Teacher extends Preson{
     4 }
     5 
     6 public class Demo {
     7     public static void main(String args[]){
     8             //这行代码就会产生多态
     9             Preson p = new Teacher();
    10     }
    11 }
    实现多态的机制:
    父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法
    多态的作用:
     把不同的子类对象当作父类类型来看,可以屏蔽不同子类对象之间的差异,写出通用代码,做出通用编程,以适应需求的不断变化
              继承关系式多态产生的前提
    例:
     1     //鸟类
     2 class Brid{
     3  public void eat() {
     4   System.out.println("一般鸟类都吃虫子");
     5  }
     6  
     7 }
     8 //麻雀
     9 class Sparrow extends Brid{
    10  public void eat(){
    11   System.out.println("我要吃虫子");
    12  }
    13 }
    14 //老鹰
    15 class Eagle extends Brid{
    16  public void eat(){
    17   System.out.println("我是空中霸主,我要吃肉");
    18  }
    19 }
    20 //觅食
    21 class Foraging{
    22  /*public void feed(Sparrow sparrow){
    23   sparrow.eat();
    24  }
    25  public void feed(Eagle eagle){
    26   eagle.eat();
    27  }
    28  */
    29  /**
    30   *上面这两个方法可以改进为下面这一个方法 ,利用多态可以达到一样的效果
    31   */
    32  //直接把父类(鸟类)传进去
    33  public void feed(Brid brid){
    34   brid.eat();
    35  }
    36 }
    37 public class TestDemo {
    38  public static void main(String[] args) {
    39   Foraging foraging = new Foraging();
    40  
    41   Sparrow sparrow = new Sparrow();
    42   /**
    43    * 这行代码就体现了多态
    44    *
    45    * 运行时根据实际的类型寻找它实际类型的方法
    46    */
    47   foraging.feed(sparrow);
    48  
    49   Eagle eagle = new Eagle();
    50   foraging.feed(eagle);
    51  
    52   /**
    53    * Eagle eagle = new Eagle();
    54    *
    55    * Dog eagle = new Eagle();
    56    *
    57    * Sparrow sparrow = new Sparrow();
    58    *
    59    * Dog sparrow = new Sparrow();
    60    *
    61    *
    62    * 也可以改变声明类型,功能的实现也不会变
    63    */
    64  
    65  }
    66 }
    分类:
            分类时多态,方法重载
            运行时多态,方法重写
     
    静态方法不能被重写,但能被子类继承。
     因为方法的重写和对象有关,而static修饰的方法和对象无关
     
    引用类型转换:
        向上转型:小--------->大 (子类---------->父类)自动转换
            把子类对象赋给父类变量
        向下转型:大--------->小(父类----------->子类)强制转换
            把父类对象强制转换成子类对象
            强转之前一般都要先判断(instanceof)
    对象类型的判断:instanceof
        格式:对象  instanceof 类
        表示判断对象是否属于这个类的类型
        返回结果:Boolean型
     
    ps:若要用来判断的对象与该类型没有继承关系,就不能使用instanceof
        
    多态时方法的调用:
        当一个引用类型的变量若声明为父类的类型,但实际上引用的是子类的对象(多态情况)
            此时该变量不能在访问子类中自己特有的字段和方法
            若子类重写了父类的方法,那么此时通过变量访问到的方法,实际上是子类的方法
     
     
    组合:
        一个类里包含另外一个类的引用,这种关系我们可以称为包含关系,也可称为”has a“的关系
     
  • 相关阅读:
    centos 7 安装VCL播放器
    pheatmap, gplots heatmap.2和ggplot2 geom_tile实现数据聚类和热图plot
    R语言通过loess去除某个变量对数据的影响
    安卓手机免root实现对其他软件最高管理(sandbox思想)
    R语言写2048游戏
    R语言各种假设检验实例整理(常用)
    R语言实现对基因组SNV进行注释
    R语言实现二分查找法
    将基因组数据分类并写出文件,python,awk,R data.table速度PK
    PHP设计模式练习——制作简单的投诉页面
  • 原文地址:https://www.cnblogs.com/Essence/p/3975979.html
Copyright © 2011-2022 走看看