java的多态

本文详细介绍了Java中的多态性概念,通过代码示例展示了多态在成员访问上的特点,包括成员变量和成员方法的访问规则。同时探讨了多态带来的好处,如简化代码和提高代码复用,以及潜在的弊端,如无法访问子类特有的方法。最后,讨论了多态转型的使用及其在内存中的体现,强调了转型在访问子类特有功能时的重要性。
摘要由CSDN通过智能技术生成


一、多态的概述

在这里插入图片描述
在这里插入图片描述
左边的是父类的引用,右边是子类的对象

代码举例说明什么是多态:

Animal类:

public class Animal {

    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat类:

public class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("猫吃鱼");
    }
}

AnimalDemo类:

public class AnimalDemo {
    public static void main(String[] args) {
        Animal a=new Cat();
    }
}

左边的是父类的引用,右边是子类的对象

二、多态中成员访问特点

代码演示访问成员变量:

Animal类:

public class Animal {
    public int age = 40;

    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat类:

public class Cat extends Animal{
    public int age=20;
    public int weight=10;

    @Override
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void playGame(){
        System.out.println("猫捉迷藏");
    }
}

测试类:
在这里插入图片描述
我们以Animal引用类型创建了Cat对象,我们可以看到age可以访问到,但是weight访问不到,这是因为我们创建的a是Animal类型的引用类型,Animal中只有age,没有weight,所以访问不了

输出:

40

输出的是父类的age的值

总结:通过多态的形式访问成员变量访问的是父类中的,他的编译要看左边,运行也要看左边

代码演示访问成员方法:

在这里插入图片描述
发现palyGame无法访问
也就是说访问成员方法编译也要看左边,左边没有就不行

输出:

猫吃鱼

也就是说运行看的是子类的方法

总结:
他的编译要看左边,运行要看右边

三、多态的好处和弊端

1.好处

我们将不用多态的代码和使用多态的代码进行比较

不使用多态的代码

Animal类:

public class Animal {

    public void eat() {
        System.out.println("动物吃东西");
    }
}

Cat类:

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

Dog类:

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}

AnimalOperator类:

public class AnimalOperator {
    public void useAnimal(Cat c){
        c.eat();
    }
    public void useAnimal(Dog d){
        d.eat();
    }
}

测试类:

public class AnimalDemo {
    public static void main(String[] args) {
        //创建动物操作类的对象,调用方法
        AnimalOperator animalOperator = new AnimalOperator();
        Cat c = new Cat();
        animalOperator.useAnimal(c);
        Dog d=new Dog();
        animalOperator.useAnimal(d);
    }
}

输出:

猫吃鱼
狗吃骨头

我们可以发现,我们每添加一种动物,都需要在AnimalOperator类中增加其对应的方法,假如添加的动物非常多的话,就会非常的繁琐

使用多态的代码

只改变AnimalOperator类中的代码

public class AnimalOperator {
    public void useAnimal(Animal animal){
        animal.eat();
    }

}

在这里插入图片描述
调用方法时将Cat传入
相当于是Animal animal=new Cat();
多态访问成员方法编译看左边,运行看右边

输出:

猫吃鱼
狗吃骨头

这样就不用每次都在AnimalOperator类中添加方法

2.弊端

当我们在子类再添加一个方法,这个方法不是重写父类的方法
Dog类:

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
    public void dogleg(){
        System.out.println("狗腿子");
    }
}

在这里插入图片描述
在AnimalOperator类中无法访问

也就是说多态的形式不能访问子类特有的功能

3.总结

在这里插入图片描述

四、多态的转型

因为我们说多态的形式不能访问子类特有的功能,所以需要用多态的转型来实现访问子类特有功能

在这里插入图片描述
父类引用指向子类对象就是向上转型

向下转型就是把父类引用转为子类对象,直接强转

五、多态转型的内存图解

在这里插入图片描述
首先执行main方法,main方法进栈,引用类型a指向new的地址001
在这里插入图片描述
a.eat执行猫里边的eat方法,执行完就出栈

执行:
在这里插入图片描述

在这里插入图片描述
引用变量a指向的就是001,是Cat类
是等价的,所以可以强转

在这里插入图片描述
执行a=new Dog();
此时a就指向了new的002地址,是一个dog类

在这里插入图片描述
执行强转
这个时候a指向的是002,是一个狗类,而Cat cc 是猫类,不能转换
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java多态指的是同一个方法名可以根据不同的对象调用出不同的行为。具体来说,多态是一种面向对象编程的特性,实现多态的方式主要有两种:方法重载和方法覆盖。方法重载指的是在一个类定义多个同名方法,但这些方法有不同的参数列表,编译器会根据参数列表的不同选择合适的方法进行调用。方法覆盖指的是子类重写父类的方法,使得在使用父类对象调用该方法时,实际调用的是子类的方法。 多态的好处在于,它可以提高代码的灵活性和可扩展性。通过多态,我们可以为不同的对象提供不同的行为,从而使得程序更加具有扩展性。此外,多态还可以让程序的调用更加简洁、清晰,提高了代码的可读性和可维护性。 下面是一个简单的Java多态的例子: ```Java class Animal { public void makeSound() { System.out.println("动物发出声音"); } } class Cat extends Animal { public void makeSound() { System.out.println("猫发出“喵喵”的声音"); } } class Dog extends Animal { public void makeSound() { System.out.println("狗发出“汪汪”的声音"); } } public class PolymorphismExample { public static void main(String[] args) { Animal animal1 = new Animal(); Animal animal2 = new Cat(); Animal animal3 = new Dog(); animal1.makeSound(); // 动物发出声音 animal2.makeSound(); // 猫发出“喵喵”的声音 animal3.makeSound(); // 狗发出“汪汪”的声音 } } ``` 在上面的例子,Animal是一个父类,Cat和Dog是Animal的子类。Animal类定义了一个makeSound()方法,Cat和Dog类分别重写了这个方法。在main()方法,我们创建了三个Animal类型的对象,并分别调用它们的makeSound()方法。由于animal2和animal3都是Animal类型的对象,但实际上它们分别是Cat和Dog类型的对象,因此在调用它们的makeSound()方法时,实际上是调用了它们各自的实现,也就是Cat类和Dog类重写的makeSound()方法。这就是Java多态的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸葛东_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值