java多态的学习

 /**
 *
 */
package com.tjb.foundation.test;

/**
 * @author tjbworkshop
 *
 */
class A{
  public String f(D obj){return ("A and D");}
  public String f(A obj){return ("A and A");}
}
class B extends A{
  public String f(B obj){return ("B and B");}
  public String f(A obj){return ("B and A");}
}
class C extends B{}
class D extends B{}

public class OverRideTest {

 /**
  *
  */
 public OverRideTest() {
  super();
  // TODO Auto-generated constructor stub
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
   A a1 = new A();
   A a2 = new B();
   B b = new B();
   C c = new C();
   D d = new D();
   System.out.println(a1.f(b));   //A and A
   System.out.println(a1.f(c));   //A and A
   System.out.println(a1.f(d));   //A and D
   System.out.println(a2.f(b));   //B and A
   System.out.println(a2.f(c));   //B and A
   System.out.println(a2.f(d));   //A and D
   System.out.println(b.f(b));    //B and B
   System.out.println(b.f(c));    //B and B
   System.out.println(b.f(d));    //A and D
 }

}
 1、前期绑定,又叫静态绑定;一般指重载,以及final、private、static成员函数。
 2、后期绑定,又叫动态绑定,即多态。一般指覆写。
 在多态中的调用有这样的规则:
 调用成员变量时,将调用引用类型所对应的类中的成员变量的,如果该类中没有定义的该变量,才会调用父类(有定义)的同名成员变量。
 调用成员方法时,将根据对象的运行时的类型来确定调用哪个成员方法,也就是说运行时类型是哪个类的引用,就调用哪个类中定义的成员方法
 a2.f(b)
 重载过程:
 this.f(o)------A.f(B),不存在的方法
 super.f(o)--------A无父类,不进行
 this.f((super)o)---------A.f(A) 找到,所以重载的结果是A.f(A)
 super.f((super)o);
 3、构造函数与多态,初始化一个子类实例的顺序是:先调用父类构造函数--->父类成员的初始化赋值---〉子类的构造函数方法体;当父类的构造方法中调用一个被子类覆写的方法时,实际调用的是子类的函数,但是有可能出错,因为这时子类的初始化动作尚未完成,如果该函数中涉及到这些初始化内容,那么有不可预测的错误发生。所以在构造方法中最好不要调用方法。
 4、abstract与static不能一起使用。因为static本质是静态绑定,而abstract本质是动态绑定的; 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值