0
点赞
收藏
分享

微信扫一扫

【Java从入门到精通】多态

Yaphets_巍 2022-04-14 阅读 83
java

目录

多态

在这里插入图片描述

概念

  1. 多态是继封装、继承之后,面向对象的第三大特性。

  2. 描述一个事物的多种形态

  3. 多态体现为父类引用变量可以指向子类对象

  4. 多态是同一个行为具有多个不同表现形式或形态的能力。

    多态就是同一个接口,使用不同的实例而执行不同操作。

    多态通过分离做什么、怎么做,通过另外一个角度将接口和实现分离。

多态的转型

在这里插入图片描述

多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();

      适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;

     适用场景:当要使用子类特有功能时。

多态的优点

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象:Parent p = new Child();

概念对比

1. 重写

重写,指的是子类对父类方法的重新定义,但是**子类方法的参数列表和返回值类型,必须与父类方法一致!**所以可以简单的理解,重写就是子类对父类方法的核心进行重新定义。

举个栗子:

class Chicken{  
     public void live(String lastword){  
        System.out.println(lastword);  
     }  
}  
class BaiqieChicken extends Chicken{  
     public void live(String lastword){  
         System.out.println("这只白切鸡说:");  
         System.out.println(lastword);  
     }  
}

这里白切鸡类重写了鸡类的live()方法,为什么说是重写呢?因为白切鸡类中live()方法的参数列表和返回值与父类一样,但方法体不一样了。

2. 重载(非多态)

重载,指的是在一个类中有若干个方法名相同,但参数列表不同的情况,返回值可以相同也可以不同的方法定义场景。也可以简单理解成,同一行为(方法)的不同表现形式。

重载就是对于同一个概念,同一个操作,因为条件不同而生成了不同的结果,或者多了一些东西,或者少了一些东西,或者根本就完全不同

举个栗子:

class BaiqieChicken extends Chicken{  
     public void live(){  
        System.out.println("这是一只会被做成白切鸡的鸡");  
     }  
     public void live(String lastword){  
         System.out.println("这只白切鸡说:");  
         System.out.println(lastword);  
     }  
}

这里的白切鸡类中的两个live()方法,一个无参一个有参,它们对于白切鸡类的live()方法的描述各不相同,但它们的方法名都是live。通俗讲,它们对于白切鸡鸡生的表现形式不同。

3. 接口实现

接口,是一种无法被实例化,但可以被实现的抽象类型,是抽象方法的集合,多用作定义方法集合,而方法的具体实现则交给继承接口的具体类来定义。所以,接口定义方法,方法的实现在继承接口的具体类中定义,也是对同一行为的不同表现形式

interface Chicken{  
    public void live();  
}  
class BaiqieChicken implements Chicken{  
     public void live(){  
        System.out.println("这是一只会被做成白切鸡的鸡");  
     }  
}  
class ShousiChicken implements Chicken{  
     public void live(){  
        System.out.println("这是一只会被做成手撕鸡的鸡");  
     }  
}

从上面我们可以看到,对于鸡接口中的live()方法,白切鸡类和手撕鸡类都有自己对这个方法的独特的定义。

绑定机制

将一个方法调用和一个方法主体关联在一起叫绑定

  • 在编译阶段能够确定方法在内存什么位置的机制就叫静态绑定机制
    所有私有方法、静态方法、构造器及final修饰方法都是采用静态绑定机制。在编译器阶段就已经指明了调用方法在常量池中的符号引用,JVM运行的时候只需要进行一次常量池解析即可。

  • **动态绑定是指在“执行期间”(而非编译期间)判断所引用的实际对象类型,根据其实际的类型调用其相应的方法。**只有普通方法调用是多态的。

举报

相关推荐

0 条评论