Java-多态

1、 概念

同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征

2、多态的形式

父类类型 对象名称 = new 子类构造器;

接口    对象名称 = new 实现类构造器;

3、多态的识别技巧

对于方法的调用:编译看左边,运行看右边。(运行用子类的方法)

对于变量的调用:编译看左边,运行看左边。(运行用父类的变量)

调用的是方法,运行出来的是构造器右边那个类的方法

调用的是变量,不管子类有没有那个变量,结果都是构造器左边那个类的变量

4、多态的使用前提

(1)必须存在继承或者实现关系。

(2)必须存在父类类型的变量引用子类类型的对象。

(3)需要存在方法重写。

public class PolymorphicDemo {

    public static void main(String[] args) {

        //  父类类型 对象名称 = new 子类构造器;

        Animal dlam = new Cat();

        dlam.run(); 

        System.out.println(dlam.name); 

        Animal taiDi = new Dog();

        taiDi.run(); 

        System.out.println(taiDi.name); 

    }

}
class Dog extends Animal{

    public String name = "Dog";

    @Override

    public void run(){

        System.out.println("Dog跑的贼快~~~~!");

    }

}
class Cat extends Animal{

    public String name = "Cat";

    @Override

    public void run(){

        System.out.println("Cat跑的飞快~~~~!");

    }

}
class Animal{

    public String name = "Animal";

    public void run(){

        System.out.println("动物跑!");

    }

}

5、多态的优劣势

(1)优势:

① 在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变,便于扩展和维护。可以实现类与类之间的解耦。

② 实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现出多态的扩展性与便利。

(2)劣势:

① 多态形式下,不能直接调用子类特有的功能。编译看左边!! 左边父类中没有子类独有的功能,所以代码在编译阶段就直接报错了!

public class PolymorphicDemo {

    public static void main(String[] args) {

        //  父类类型 对象名称 = new 子类构造器;
        Animal dlam = new Dog();
        dlam.run(); // 对于方法的调用:编译看左边,运行看右边。

        // dlam.lookDoor(); // 报错了,多态形式下,编译看左边,左边没有独有功能
        Animal taidi = new Dog();
        go(taidi);
        Animal tom = new Cat();
        go(tom);
    }

    // 开发一个游戏 所有动物都可以进来比赛
    public static void go(Animal d){
        System.out.println("开始。。");
        d.run();
        System.out.println("结束。。");
    }
}
class Dog extends Animal{
    @Override
    public void run(){
        System.out.println("Dog跑的贼快~~~~!");
    }

    // 独有功能
    public void lookDoor(){
        System.out.println("Dog看门");
    }
}
class Cat extends Animal{

    @Override
    public void run(){
        System.out.println("Cat跑的飞快~~~~!");
    }

    // 独有功能
    public void catchMouse(){
        System.out.println("Cat抓mouse");
    }
}
class Animal{
    public void run(){
        System.out.println("动物跑!");
    }
}

6、引用类型自动类型转换

(1)小范围类型的变量或者值可以直接赋值给大范围类型的变量。

(2)大范围类型的变量或者值必须强制类型转换给小范围类型的变量。

public class PolymorphicDemo {
    public static void main(String[] args) {
        // 1.引用类型的自动类型转换:小范围的对象赋值给大范围的变量
        Animal a = new Cat();

        // 2.引用类型的自动类型转换:小范围的变量赋值给大范围的变量
        Cat c = new Cat();
        Animal a1 = c;
    }
}
class Animal{

}
class Cat extends Animal{

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值