java中的多态

发布于:2024-07-31 ⋅ 阅读:(113) ⋅ 点赞:(0)

多态基础了解:

面向对象的三大特征:封装,继承,多态。

有了面向对象才有继承和多态,对象代表什么,就封装对应的数据,并提供数据对应的行为,可以把零散的数据和行为进行封装成一个整体-->对象

但是对象多了之后,对象里面的内容,共性部分越来越多了,由此将共性部分抽取出来放在父类,不用在写一遍了--->继承

没有继承也就没有多态

案例:

package duotai;

public class animal {
    public static void main(String[] args) {
//创建对象(用多态方式)//FU f=new ZI();
        Animal a = new Dog();
 //调用成员变量:编译看左边,运行也看左边
        //编译看左边,Javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。
        //运行看左边,javac运行代码的时候,实际上获取的就是左边父类中成员变量的值
        System.out.println(a.name);//结果是动物//当注释掉animal中的name,这里会报错,因为父类中没有这个变量
//调用成员方法:编译看左边,运行看右边
        //编译看左边:Javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
        a.show();//运行结果是Dog
//理解//方法重写会覆盖,我们是用父类调用的,之前继承是用dog自己调用的
    }
}
class Animal{
    String name="动物";//父类
    public void show(){
        System.out.println("动物展示");
    }
}
class Dog extends Animal{
    String name="狗";

    @Override
    public void show() {
        System.out.println("狗展示");
    }
}
class Cat extends Animal{
    String name="猫";
   @Override
    public void show(){
       System.out.println("猫展示");
   }
}

Java加载字节码文件的时候,先加载父类字节码文件的!!!

多态调用内存图解:

这个视频的9分09秒开始讲的:面向对象进阶-10-多态中调用成员的特点_哔哩哔哩_bilibili

 

多态的优势和弊端:

多态的弊端:不能调用子类中特有功能

在这个视频9分5秒开始:面向对象进阶-11-多态的优势和弊端_哔哩哔哩_bilibili

案例综合练习:

代码:

package duotai.anli;

public class Animal {
    private String age;
    private String color;

    public Animal() {
    }

    public Animal(String age, String color) {
        this.age = age;
        this.color = color;
    }

    /**
     * 获取
     * @return age
     */
    public String getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(String age) {
        this.age = age;
    }

    /**
     * 获取
     * @return color
     */
    public String getColor() {
        return color;
    }

    /**
     * 设置
     * @param color
     */
    public void setColor(String color) {
        this.color = color;
    }
public void eat(String something){
        System.out.println("动物再吃"+something);
}

}
package duotai.anli;

public class cat extends Animal {
    public cat() {

    }

    public cat(String age, String color) {
        super(age, color);
    }

    @Override
    public void eat(String something) {
        System.out.println(getAge()+"岁的"+getColor()+"的猫眯着眼睛侧着头吃"+something);
    }
}
package duotai.anli;

public class Dog extends Animal {
    public Dog() {
    }

    public Dog(String age, String color) {
        super(age, color);
    }
    //行为eat
    @Override
    public void eat(String something){
        System.out.println(getAge()+"岁的"+getColor()+"的狗两只前腿死死抱住"+something+"猛吃");
    }
    public void lookhome(){
        System.out.println("狗在看家");
    }
}
package duotai.anli;



public class person {
    private String name;
    private int age;

    public person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //行为
    public void keeppet(Dog dog,String something) {
        System.out.println("年龄为"+age+"岁的"+name+"养了一只"+dog.getColor()+dog.getAge()+"岁的狗");
    dog.eat(something);
    }
    public void keeppet(cat cat,String something) {
        System.out.println("年龄为"+age+"岁的"+name+"养了一只"+cat.getColor()+cat.getAge()+"岁的猫");
        cat.eat(something);
    }
    ///可用多态来写
    public void keeppetyouhua(Animal animal,String something) {

    if (animal instanceof Dog d3){
        System.out.println("年龄为"+age+"岁的"+name+"养了一只"+animal.getColor()+animal.getAge()+"岁的狗");
    d3.eat(something);
    }else if (animal instanceof cat c3){
        System.out.println("年龄为"+age+"岁的"+name+"养了一只"+animal.getColor()+animal.getAge()+"岁的猫");
    c3.eat(something);
    }else {
        System.out.println("没有这种动物");
    }
    }
}

测试:

package duotai.anli;

public class text {
    public static void main(String[] args) {
        //创建对象并调用方法
        //ctrl + p可以查看要传递啥//shft +f6批量修改
        person p1=new person(30,"老王");
        Dog d= new Dog("2","黑");
        p1.keeppet(d,"骨头");
        person p2=new person(25,"老李");
       cat cat= new cat("3","灰");
        p2.keeppet(d,"鱼");
        System.out.println("==============================");
        System.out.println("------------------------------");
        person p3=new person(30,"老王");
        Dog d3=new Dog("2","黑");
        cat c3= new cat("3","灰");
        p3.keeppetyouhua(d3,"骨头");
        p3.keeppetyouhua(c3,"鱼");


    }
}

运行结果: