多态是面向对象的第三大特征,意为一个名字有多种语言,即在程序设计中一种定义,多种实现,Java实现多态由向上转型和动态绑定机制结合完成,即在继承关系下每个子类都定义有重写的方法,利用向上转型机制将子类对象转化为父类对象,转型后的父类对象通过动态绑定机制自动调用转换前所属子类的方法


【1】方法的重载:一个类中允许同时存在一个以上方法名相同,但方法签名(方法名+参数)不同(类型,个数)的同名方法


(1)方法的重载与方法的重写均能体现面向对象的多态性,但重载主要用于一个类中实现若干个重载的方法,重写主要用于子类继承父类时,对父类方法的重新实现


(2)构成重载的条件


1.参数类型不同
 
public 
  static 
  int 
  add 
  ( 
  int 
  a 
  ) 
  {
 
 
          
  return 
  a 
  ;
 
 
// 定义与第一个方法相同名称、参数类型不同的方法
 
 
      
  public 
  static 
  double 
  add 
  ( 
  double 
  a 
  , 
  double 
  b 
  ) 
  {
 
 
          
  return 
  a 
  + 
  b 
  ;
 
} 
 2.参数个数不同
 
public 
  static 
  int 
  add 
  ( 
  int 
  a 
  ) 
  {
 
 
          
  return 
  a 
  ;
 
 
  
  // 定义与第一个方法参数个数不同的方法
 
 
      
  public 
  static 
  int 
  add 
  ( 
  int 
  a 
  , 
  int 
  b 
  ) 
  {
 
 
          
  return 
  a 
  + 
  b 
  ;
 
} 
 3.参数顺序不同
 
 
 
 
public 
  static 
  int 
  add 
  ( 
  int 
  a 
  , 
  double 
  b 
  ) 
  {
 
 
          
  return 
  ( 
  int 
  ) 
  ( 
  a 
  + 
  b 
  ) 
  ;
 
 
      
  }
 
 
      
  // 这个方法与前一个方法参数次序不同
 
 
      
  public 
  static 
  int 
  add 
  ( 
  double 
  a 
  , 
  int 
  b 1.参数类型不同
public static int add ( int a ) {
          return a ;
// 定义与第一个方法相同名称、参数类型不同的方法
      public static double add ( double a , double b ) {
          return a + b ;
} 2.参数个数不同
public static int add ( int a ) {
          return a ;
  // 定义与第一个方法参数个数不同的方法
      public static int add ( int a , int b ) {
          return a + b ;
} 3.参数顺序不同

public static int add ( int a , double b ) {
          return ( int ) ( a + b ) ;
      }
      // 这个方法与前一个方法参数次序不同
      public static int add ( double a , int b ) {
          return ( int ) ( a + b ) ;

  ;



【2】绑定


(1)静态绑定(前期绑定):编译时,编译器判断应当调用那个方法,发生在程序运行前。


使用:对象的声明与对象创建时是同一个类,使用(对象+.)的方式调用类的数据


(2)动态绑定(后期绑定):程序运行时jvm根据对象实际类型判断该调用那个方法


使用:运行时才把方法调用与方法所属类关联在一起,即对象的声明与对象创建时不是同一个类但具有父子类关系,使用(对象+.)调用的是实际创建对象的类的方法


【3】类的转型


(1)向上转型:子类的对象可以赋值给父类的对象,即子类对象可以向上转型为父类类型


【【1】】转型后的子类对象只能调用父类定义的方法,无法使用子类独有的数据


【【2】】以为动态绑定机制,Java能识别出对象转化之前的类型,并调用该类中对应的方法


【【3】】调用父类方法时父类类型可代表他的所有子类,作为参数

class Quadrangle { // 四边形类
      public static void draw ( Quadrangle q ) { // 四边形类中的方法
          // SomeSentence
public class Parallelogram extends Quadrangle { // 平行四边形类,继承了四边形类
      public static void main ( String args []) {
          Parallelogram p = new Parallelogram () ; // 实例化平行四边形类对象引用
          draw ( p ) ; // 调用父类方法


(2)向下转型:将较为抽象的类(父类)转化成具体的类(子类)


问题:越具体的类特性越多,从具体到抽象会减少类的特性(类似double到int)


解决:显示类型转化(强制类型转化)将子类转化成父类,其方法的调用规则参照继承中的转化规则


【4】多态的实现


(1)在继承关系下重写方法


(2)将子类对象向上转型为父类类型,父类类型调用同名方法,借动态绑定识别具体执行那个类的方法