目录

  • 多态的概念
  • 多态的前提
  • 多态的作用
  • 多态的访问特点
  • 方法调用
  • 变量调用
  • 多态的应用
  • 多态的类型转换
  • 最后


多态的概念

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

多态的前提

有继承/实现关系

有方法重写

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

多态的作用

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

多态的访问特点

方法调用

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

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

变量调用

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

(变量没有多态性)

多态的应用

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

//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();
        }
    }
}

java 多态 隐藏 java多态通俗易懂_父类

最后

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