java===多态性

package cn.java;
/**
 * 对象的多态性
 * 父类型指向子类对象
 * 简单说,就是一个对象对应着不同类型,多态在代码中的体现,
 *      父类或者接口的引用指向其子类的对象。
 *      
 * 多态的好处:
 * 提高了代码的扩展性,前期定义的代码可以使用后期的内容。
 * 多态弊端:
 * 前期定义内容不能调用后期子类特有内容
 * 多态的前提:
 * 1、必须由关系,继承或者实现。
 * 2、要有覆盖
 * */
abstract class Animal{
    abstract void eat();
}
class Dog extends Animal{
    void eat(){
        System.out.println("啃骨头");
    }
    void lookHome(){
        System.out.println("看家");
    }
} 
class Cat extends Animal{
    void eat(){
        System.out.println("吃鱼");
    }
    void play(){
        System.out.println("抓老鼠");
    }
}
public class Javaduotai {

    public static void main(String[] args) {
//        Cat c=new Cat();
//        c.play();
//        method(c);
//        Dog D=new Dog();
//        method(D);
        Animal animal=new Cat();//自动类型提升,猫对象提升为动物类型。不能叫小动物去抓老鼠,所以不能使用猫的特有方法;
        animal.eat();//作用就是限制对特有功能的访问。
//如果想用猫内特有方法,可以将该对象进行向下转型。
        Cat c1=(Cat)animal;//向下转型,是为了使用子类的特有方法
        c1.play();
        /**注意:对于转型,自始至终都是子类对象在做着类型的变化。不能new Dog() 然后转成Cat*/
        method(new Dog());
    }
    public static void method(Animal A){//多态Anima A=c或者D
        A.eat();
        if(A instanceof Cat)//instanceof,用于判断对象的具体类型,只能用于引用数据类型的判断。
            //通常在向下转型前用于健壮性判断;
        {
        Cat cat=(Cat)A;
        cat.play();
        }else if(A instanceof Dog)
        {
            Dog dog=(Dog)A;
            dog.lookHome();
        }
    }

}
package cn.java;
/**多态时:
 * 1、成员变量特点
 * 编译时:参考引用型变量所属的类中是否有调用的成员变量,有,编译通过,没有,编译失败。
 * 运行时:参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员
 * 单间说:编译时和运行时参考等号的左边,哦了。
 * 2、成员函数特点
 * 编译时:参考引用型变量所属的类中是否有调用的函数,有,编译成功,没有编译失败。简单说就是看父类中是否有想对应方法或者属性,有就编译成功,没有编译失败
 * 运行时:参考对象所属的类中是否有调用的函数。
 * 简单说:编译看左边,运行看右边
 * 3、静态函数的特点
 * 编译时:参考引用类型变量所属的方法中是否存在调用的静态方法
 * 运行时:参考引用类型变量所属的方法中是否存在调用的静态方法
 * 简单说:都看右边*/
class F1{
    int  num=3;
    void show(){
        System.out.println("f   show");
    }
    static void tell(){
        System.out.println("a");
    }
}
class Z1 extends F1{
    int num=4;
    void show(){
        System.out.println("Z show");
    }
    static void tell(){
        System.out.println("b");
    }
}
public class Javaduotai2 {

    public static void main(String[] args) {
        F1 f1=new Z1();
        System.out.println(f1.num);//3
        f1.show();
        f1.tell();//静态函数不涉及多态 原因是可以直接使用类名调用F1.tell();z1.tell();
        // TODO Auto-generated method stub

    }

}
package cn.java;
/**
 * 定义USB接口规则,从而降低笔记本与外设设备的耦合性,同时实现功能扩展*/
interface USB{
    public void open();
    public void close();
}
class Mouse implements USB{
    public void open(){
        System.out.println("鼠标连接成功");
    }
    public void close(){
        System.out.println("鼠标拔出");
    }
}
class Upan implements USB{
    public void open(){
        System.out.println("Upan连接成功");
    }
    public void close(){
        System.out.println("Upan拔出");
    }
}
public class JavaInterface {

    public static void main(String[] args) {
        useUSB(new Upan());
        useUSB(new Mouse());

    }
    public static void useUSB(USB u){
        if(u!=null){
        u.open();
        u.close();}
    }

}
原文地址:https://www.cnblogs.com/wangyinxu/p/6558559.html