代码无法正常工作,除非我扩展类

时间:2019-02-12 17:42:18

标签: java inheritance polymorphism

我正在练习多态性和继承性,我创建了一个类(Animals)来设置动物的名称,然后我创建了一个子类(Cat)来设置其发出的声音,最喜欢的玩具。我曾尝试在单独的课程(测试)中对其进行测试,以打印出“猫喜欢Moew,它最喜欢的玩具是Yarn”,但除非在测试课程中扩展Cat,否则它就无法工作。

这里是我的代码。

Animals.java

public class Animals {

protected static String name;

public Animals() {

}

public Animals(String name) {
    this.name = name;
}

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

public String getName() {
    return name = name;
}

public static void animMove() {
    System.out.println(name + " likes to walk");
}

}

Cat.java

public class Cat extends Animals {

public static String sound;
public static String favToy;

public String getSound(String sound) {
    return this.sound = sound;
}

public String getToy(String favToy) {
    return this.favToy = favToy;
}

public Cat() {

}

public Cat(String name, String sound, String favToy) {
    super(name);
    this.sound = sound;
    this.favToy = favToy;
}

}

test.java

public class test{

public static void main(String[] args) {
    Animals anim = new Animals();

    Cat cat = new Cat("Cat", "moew", "Yarn ball");
    System.out.println(anim.getName() + " Likes to " + cat.getSound(sound) 
    + ", its favourite toy is a " + cat.getToy(favToy));


}

}

如果我将Cat扩展到测试类,则一切正常,但是当我不这样做时,声音和favToy之类的变量都不起作用。在不将任何内容扩展到测试类的情况下我该怎么做

2 个答案:

答案 0 :(得分:3)

不要将名称变量设为静态。这意味着它属于该类,而不属于Animal对象,这意味着该类中永远只有一个Animal.name。您的Cat.soundCat.favoriteToy变量也是静态的,这意味着所有的猫都会具有相同的声音和相同的喜欢的玩具(我想这是可以接受的,但是不要在构造函数中分配它)。

设置者不需要有返回值(您只需更改一些变量)。例如:

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

字母不需要任何参数。您已经知道要返回什么,不需要参数。例如:

public String getSound() {
   return this.sound;
}

此外,您的Animals应该是Animal,因为此类代表一只动物。

如果您创建一个Cat对象,那么该对象也将自动为Animal(继承),因此无需像在主方法中一样创建两者。

Cat myCat = new Cat("Purr","meow","ball"); //create cat
System.out.println(myCat.getName());

变量是静态的,所以所有的猫现在都拥有这个名字,声音和最喜欢的玩具...

答案 1 :(得分:0)

也许您尝试做类似的事情

1)

public class Animal {

    protected String name;

    public String animMove() {
        return new String(this.name + " likes to walk");
    }

}

2)

public class Cat extends Animal {

    public String sound;
    public String favToy;

    public Cat(String name, String sound, String favToy) {
        super(name);
        this.sound = sound;
        this.favToy = favToy;
    }

    public String getName() {
        return super.name;
    }

    public String getSound() {
        return this.sound;
    }

    public String getToy() {
        return this.favToy;
    }

}

3)

public class test{

    public static void main(String[] args) {
        Animal anim = new Cat("Cat", "moew", "Yarn ball");

        System.out.println(anim.getName() + " Likes to " + anim.getSound(sound) + ", its favourite toy is a " + anim.getToy(favToy) + " " + anim.animMove());

    }

}