Код не работает должным образом, если я не расширяю класс - PullRequest
0 голосов
/ 12 февраля 2019

Я практикую полиморфизм и наследование, и я создал класс (Animals), который задает имя животного, затем я создал подкласс (Cat), который задает звук, который он издает, любимую игрушку ... и все такое.я попытался протестировать его в отдельном классе (Test), чтобы распечатать «Cat любит Moew, его любимая игрушка - пряжа», но он не работает, если я не расширю 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 натестовый класс, но когда я не знаю, ни одна из переменных, таких как sound и favToy, не работает.как бы я это сделал, не распространяя ничего на тестовый класс

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Возможно, вы пытались сделать что-то вроде

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

    }

}
0 голосов
/ 12 февраля 2019

Не делайте переменную имени статической.Это будет означать, что он принадлежит классу, а не объекту Animal, то есть в классе будет только один Animal.name.Ваши переменные Cat.sound, Cat.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());

переменные являются статическими, поэтому у всех кошек теперь будет это имя, звук и любимая игрушка...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...