十五、Java基础之多态

/*
一、关于java语言中向上类型转型和向下类型转型:
1.向上类型转型(upcasting):子--->父
2.向下类型转型(downcasting):父--->子

注意:无论是向上类型转型还是向下类型转型,两个类之间必须要有继承关系
*/
Animal类
public class Animal {

    public void m1(){
        System.out.println("动物喜欢睡觉!");
    }
}

Dog类

public class Dog extends  Animal{
    public void m1(){
        System.out.println("狗喜欢叫!");
    }
}

Cat类

public class Cat extends Animal{

    public void m1(){
        System.out.println("猫喜欢喵!");
    }

    public void move(){
        System.out.println("猫喜欢吃老鼠!");
    }
}

测试:

public class Test02 {

    public static void main(String[] args){

        //向上类型转型又被称作:自动类型转换
        //父类型的引用指向子类型的对象
        //程序分为两个阶段:编译阶段,运行阶段
        //程序编译阶段只知道是一个Aninmal类型引用
        //程序在运行时期,堆中的实际对象时Cat类型
        Animal a=new Cat();

        //程序在编译阶段a被编译器看做是Animal类型
        //所以程序在编译器a引用绑定的是Animal类型中的m1方法(静态绑定)
        //程序运行时,堆中的对象实际上是cat类型,而cat类型已经重写了方法m1方法
        //所以程序在运阶段对象绑定的是cat方法中的m1方法(动态绑定)
        a.m1();//猫喜欢喵!

        //向下类型转换,强制转换类型
        Animal a1=new Cat();//向上类型转换
        //强制类型转换,需要加强制类型转换符
        Cat c=(Cat) a1;
        c.move();





    }
}

 二、关于多态的好处

1.多态:父类型的引用指向子类型的对象

多态:
1.使用多态可以使代码的耦合度降低
2.项目的扩展功能增强

例子1:主人,宠物,测试程序
/*
模拟主人

 */
public class Person {

    public void feed(Dog d){
        d.eat();
    }

    public void feed(Cat c){
        c.eat();
    }

    
}
/**/
public class Dog {

    public void eat(){

        System.out.println("狗吃东西!");
    }
}
//测试程序
public class Test01 {

    public static void main(String[] args){

        //创建主人
        Person p=new Person();

        //创建宠物
        Dog d=new Dog();
        Cat c=new Cat();

        p.feed(d);
        p.feed(c);
    
    }
}

再加一只宠物

public class Cat {
    public void eat(){

        System.out.println("猫吃东西!");
    }
}

程序改进

//person类型的扩展能力太差
//尽量不要面向具体和编程,面向父类型编程,面向抽象编程
因此加一种类型:Animal,这样Person就不需要变动
/*
模拟主人
多态:父类型的引用指向子类型的对象

多态:
    1.使用多态可以使代码的耦合度降低
    2.项目的扩展功能增强
 */
public class Person {

//    public void feed(Dog d){
//        d.eat();
//    }
//
//    public void feed(Cat c){
//        c.eat();
//    }

    //person类型的扩展能力太差
    //尽量不要面向具体和编程,面向父类型编程,面向抽象编程
    public void feed(Animal a){
        a.eat();
    }
}
/*
Animal
*/
public class Animal {

    public void eat(){}
}
/*
狗,继承Animal
 */
public class Dog extends Animal {

    public void eat(){

        System.out.println("狗吃东西!");
    }
}
//猫继承Aninal
public class Cat extends Animal{

    public void eat(){

        System.out.println("猫吃东西!");
    }
}
//测试程序
public class Test01 {

    public static void main(String[] args){

        //创建主人
        Person p=new Person();

        //创建宠物
        Dog d=new Dog();
        Cat c=new Cat();

        //升级
        //
        p.feed(d);
        p.feed(c);
    }
}

 

 
posted @ 2018-12-02 16:12  旅行没有终点  阅读(187)  评论(0编辑  收藏  举报