1.多态的含义是:对外一种表现形式,内在有多种具体实现。

2.Java中多态的具体体现:方法重载;方法覆盖;多态参数。

3.运行期类型与编译期类型:

①编译期类型和运行期类型相同: A  a = new A();

                               a.show();

a声明A的时候,使用到的类型A表示对象的类型,被称为编译期类型,在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证。

b构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法。

②当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型。

//A类是B类的父类                              

A  ab = new B();

ab.show();

a对象ab的编译期类型为父类A类,运行期类型为子类B类。

b如果一个引用的编译期类型和运行期类型不同,那么一定是编译期类型与运行期类型有父类子类关系。

c ab对象使用的方法,在编译期到类A中去校验,而运行则执行B类的方法。

d如果一个对象的编译期类型是父类,运行期类型是子类,可以对该对象进行强制类型转换,将其编译器类型转换为与运行期类型相同的类型,即:B b=(B)ab;

4.父类引用指向子类对象:当编译器类型是父类,运行期类型是子类时,被称为父类引用指向子类对象。

class  Animal{

               ……

}

class Cat  extends Animal{

               ……

}

class Dog extends Animal {

               ……

}

Cat m = new Cat()

Animal x = new Cat()  //Animal 的引用指向Cat的对象

对象m可以调用猫类中的所有方法,x只能调用动物类中定义的方法,

猫类扩展的新方法不能调用。

5.多态环境下对属性和方法的调用:

①多态环境下对成员方法的调用:编译看左边,运行看右边。

②多态环境下对静态成员方法的调用:编译和运行都看左边。

③多态环境下对成员变量的调用:编译和运行都看等号左边。

④ 注意:变量不存在被子类覆写这一说法,只有方法存在覆写。

6.多态参数:好处是提高代码的扩展性

class  Animal{

           void eat() {}

}

class  Cat extends Animal{

            void eat() {}

}

class Dog extends Animal{

            void eat(){}

}

//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象

method(Animal  animal){  

     animal .eat();                

}

7.多态环境下对象造型:

①向下造型 –又称向下转型。为了使用子类中的特有方法。

class Animal{

abstract void eat();

}

class Cat extendsAnimal{

void look() {

System.out.println("看家");

}

}

………

Animal x=new Cat()

Cat  m=(Cat)x;  //向下转型

m.eat() ;

m.look();//子父类中的方法都可以使用

②向上造型 –又称自动类型提升。提高程序的扩展性。

class Animal{

     abstract void eat();

}

class Cat extends Animal{

      void look() {

System.out.println("看家");

 }

    }      

 ………

   Animal x=new Cat()  //向上造型,Cat对象提升到Animal对象

   x.eat()   //只能使用父类中的方法

   x.look()  //报错!不能使用子类中的方法

8.instanceof 操作符:用来在运行时指出对象是否是特定类的一个实例。

instanceof 用法:

result = 对象名称 instanceof  类型

②参数:布尔类型。

③对象名称:必选项,任意对象表达式。

④ 类型:必选项,任意已定义的类,可以是API中的类,可以是自定义的类。

⑤ 说明:如果对象是这个类型的一个实例,则 instanceof 运算符返回 true。如果对象不是指定类的一个实例,或者对象是 null,则返回 false