面像对象 多态与抽象

         多态

  相同的行为,不同的实现    同样类型的变量,调用同样的方法,却产生不同的行为。

  要理解多态性,首先要知道什么是“向上转型”和“动态绑定“

  向上转型:比如一个父类父类Animal和一个子类cat,我们可以说这只猫是动物,但是不能说动物就是只猫。因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的。

  动态绑定:在运行时根据具体对象的类型进行绑定。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。

  java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态

//父类
public class Father{
  //父类有一个打孩子方法
  public void hitChild(){
  }
}
//子类1
public class Son1 extends Father{
  //重写父类打孩子方法
  public void hitChild(){
  System.out.println("为什么打我?");
  }
}
//子类2
public class Son2 extends Father{
  //重写父类打孩子方法
  public void hitChild(){
  System.out.println("我知道错了。");
  }
}

//测试类  
public class Test{  
    public static void main(String args[]){         Father father;   
       father = new Son1(); 

   father.hitChild();   

 

       father = new Son2();

   father.hitChild();

调用了相同的方法,出现了不同的结果!

子类可以直接向上转型,调用父类的方法,不会出现错误。但是在父类调用子类的方法时,必须是掉用之前转为父类的方法。不然会报错。我们在编程的可能会不知道是那一个。这时候可以用关键字instanceof来判定

 

      抽象

  

  java是面向对象的编程,而现实中有很多对象,都是具体的,要一一写具体类来描述它们很麻烦,所以把它们抽象出来,做抽象类。具体的就是你自己去通过继承一个抽象类来描述具体类。
  使程序设计方便,更合理,能更好的规范子类
  比如: 老师指着一个杯子说,小张你去帮我把那个东向拿过来。然后小张说,老师,你叫我拿那个杯子吗? 在这句话里那个东西就是父类,杯子就是子类,我们可以不去定义父类的属性,由子类把需要的属性写出来

  抽象方法定义在抽象类或接口中,它只有方法的声明没有实现例如;

public abstract class AAA{
public abstract void test();
}
上面的test方法就是抽象方法,他后面直接写一个;号不能带{}
当一个类名中有一个方法定义为抽象方法,那么这个类必须定义为抽象类 关键字(abstract)
抽象类不能产生对象(不能new出来) 因为没有属性
抽象类只能由子类访问其构造方法   
如果父类是抽象类,那么任何子类必须重写抽象方法,除非子类也是抽象的。

posted @ 2014-04-20 22:13  大石碎胸口  阅读(192)  评论(0编辑  收藏  举报