Обязательные переменные класса в Java? - PullRequest
2 голосов
/ 03 августа 2020

Скажем, в целях иллюстрации у меня есть абстрактный класс Animal, и у каждого Animal есть numberOfLegs. Собака расширяет Животное, и у всех собак число Ног равно 4. Можно ли сделать numberOfLegs ...

  1. Stati c
  2. Required (все, что расширяет Animal, должно определять numberOfLegs, или есть какое-то значение по умолчанию)
  3. Доступно из Animal (это меня не особо беспокоит, но если сказать, что метод walk () был вызван из Dog, может ли Animal просмотреть количество ног без необходимости передавать дополнительное значение?)

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

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Возможно ли сделать numberOfLegs: Stati c

Это сделает каждый экземпляр класса, расширяющего Animal, одинаковым numberOfLegs. См .: здесь для объяснения.

public abstract class Animal
{
    private static int NUMBER_OF_LEGS = 4;
}

Можно ли сделать numberOfLegs: Обязательно

Да, вам просто нужно сделать в абстрактном классе и инициализировать его в конструкторе.

public abstract class Animal
{
    private int numberOfLegs;

    public int getNumberOfLegs()
    {
        return this.numberOfLegs;
    }

    public Animal(int numberOfLegs)
    {
        this.numberOfLegs = numberOfLegs;
    }
}

public class Zebra extends Animal
{
    public Animal(int numberOfLegs)
    {
        super(numberOfLegs);
    }
}

все, что расширяет Animal, должно определять numberOfLegs, или существует какое-то значение по умолчанию

Кроме того, если вам нужно значение по умолчанию для количества ног, вы можете включить конструктор для Animal без параметра numberOfLegs и установить для него значение, скажем 4.

public abstract class Animal
{
    private int numberOfLegs;

    public Animal()
    {
        this.numberOfLegs = 4;
    }
}

Возможно ли сделать numberOfLegs : Доступно из Animal

Да, вы можете вызвать метод (если он абстрактный в классе Animal) из любого объекта, расширяющего Animal

Zebra z = new Zebra(4);
System.out.println(z.getNumberOfLegs());
3 голосов
/ 03 августа 2020

Ни статические c переменные, ни переменные экземпляра не участвуют в полиморфизме. Просто объявите абстрактный метод , например int getNumberOfLegs(), в абстрактном классе. Ваш класс Dog может быть:

class Dog extends Animal {
    private static final int NUMBER_OF_LEGS = 4;
    public int getNumberOfLegs () {
        return NUMBER_OF_LEGS;
    }
}
...