首页 > 解决方案 > 参数中的 Java 多态性

问题描述

我遇到了多态函数调用的问题。我检查了其他问题,但那些只询问了没有参数的函数。就我而言,我需要使用参数,因此它决定运行哪个方法,具体取决于输入参数的类。

我想要做的是有一个动物列表,里面装满了狗、猫等,当我调用每个 .hits(otherAnimal) 方法时,它应该以其他动物的类作为输入参数运行该函数。例如: dog hits cat -> dog.hits(Cat c) 应该被调用。对于通过 Animal 列表的迭代,我需要 hits(Animal a) 抽象函数,否则它不起作用。但正因为如此,现在只调用 .hits(Animal a) 函数,而不是以给定子项作为参数的函数。我知道我做错了什么,只是想不通,是什么。希望有人能启发我!

也许示例代码可以更好地解释它想要做什么,所以这里是:

public class PolyTest {

    public static void main(String[] args) {
        LinkedList<Animal> aList = new LinkedList<Animal>();
        
        aList.add(new Dog(4,"wof"));
        aList.add(new Cat(3, "mewoo"));
        
        //every animal hits itself and every other animal
        for(int i=0; i<aList.size(); i++) {
            for(int j =0; j<aList.size(); j++) {
                aList.get(i).hits(aList.get(j));
            }
        }
    }
}

动物类:

public abstract class Animal {
        int legNum;
        String sound;
        
        public Animal(int legNum, String sound) {
            this.legNum = legNum;
            this.sound = sound;     
        }
        
        abstract void hits(Animal a);
}

public class Dog extends Animal{
    public Dog(int legNum, String sound) {
        super(legNum, sound);
    }

    @Override
    public void hits(Animal a) {
        System.out.println("Dog: Animal case");
    }

    public void hits(Dog d) {
        System.out.println("Dog: pats other dog head");
    }
    
    public void hits(Cat c) {
        System.out.println("Dog: hits cat");
    }
        
}

public class Cat extends Animal {

    public Cat(int legNum, String sound) {
        super(legNum, sound);
    }

    @Override
    public void hits(Animal a) {
        System.out.println("Cat: Animal case");     
    }
    
    public void hits(Cat c) {
        System.out.println("Cat: Purrs with cat");
    }

    public void hits(Dog d) {
        System.out.println("Cat: Runs away");
    }

}

标签: javaparameterspolymorphismextends

解决方案


推荐阅读