面向对象三大特征之多态——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“的关系
 
posted @ 2014-09-16 22:24  君忘丶  阅读(1354)  评论(0编辑  收藏  举报