Java基础之多态(最简单最详细)

多态的概念

多态是同一个行为具有多种不同的表现形式

多态的前提

有继承/实现关系

有方法重写

有父类引用指向子类对象。(或者接口指向实现类对象)

多态的作用

增加通用性,可以将一个变量使其可以接收多种类型的变量。

多态的访问特点

方法调用

编译看左边(父类),运行看右边(子类)

编译看左边(能调用什么方法,要看父类,父类没有的方法无法调用),运行看右边(具体的运行效果参照子类)

变量调用

编译看左边(父类),运行也看左边(子类)

(变量没有多态性)

多态的应用

把方法的参数设计为父类,调用时可以接收任意子类,提高代码的扩展性和灵活性

//Animals
public class Animals {
    public void eat(){
        System.out.println("动物吃饭");
    }
}
//Cat
public class Cat extends Animals{
    @Override
    public void eat() {
        System.out.println("猫吃耗子");
    }
}
//Dog
public class Dog extends Animals {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}
//测试类
public class Person {
    public static void main(String[] args) {
        feed(new Cat());
        System.out.println("---------");
        feed(new Dog());
    }

/*方法的参数如果定义成Cat或Dog,那就只能传入一种
如果想再传入另一种只能进行方法重载
在这里将参数定义为父类Animals,运用了多态,可以传入多种类型
*/
    public static void feed(Animals a) {
        System.out.println("开始");
        a.eat();
        System.out.println("结束");
    }
}

多态的类型转换

方法调用:编译看左边,运行看右边

缺点:多态下无法使用子类特有的方法

解决方法:类型转换

在强转时,如果实际类型不匹配,就会造成转换异常

对象名 Instanceof 类名 :对象是否属于类,属于返回true,否则返回false

给Cat和Dog加上特有的方法

//Animals
public class Animals {
    public void eat(){
        System.out.println("动物吃饭");
    }
}
//Cat
public class Cat extends Animals{
    @Override
    public void eat() {
        System.out.println("猫吃耗子");
    }

	//特有方法
    public void games(){
        System.out.println("猫玩毛球");
    }
}
//Dog
public class Dog extends Animals {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    
	//特有方法
    public void games(){
        System.out.println("狗玩飞盘");
    }
}
public class Person {
    public static void main(String[] args) {
        feed(new Cat());
        System.out.println("---------");
        feed(new Dog());
        System.out.println("--------");

		//调用特殊方法
        skill(new Dog());
        skill(new Cat());
    }

    public static void feed(Animals a) {
        System.out.println("开始");
        a.eat();
        System.out.println("结束");
    }

    public static void skill(Animals a){
        if(a instanceof Cat){
            //并没有产生新的对象,而只是进行了类型转换
            Cat cat = (Cat) a;
            cat.games();
        }else if(a instanceof Dog){
            Dog dog = (Dog)a;
            dog.games();
        }
    }
}

在这里插入图片描述

最后

如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值