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“的关系
     
  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/Essence/p/3975979.html
Copyright © 2011-2022 走看看