Трудно заставить мой дочерний класс точно перезаписать мой родительский класс - PullRequest
0 голосов
/ 17 октября 2019

Я не новичок в кодировании, но плохо знаком с полиморфизмом / наследованием / и т.д. Меня смущает статическое / динамическое связывание и, в частности, что происходит, когда я помещаю разные подклассы в массив вместе. Я работаю с некоторыми очень простыми классами животных и просто пытаюсь выучить основы.

Я тоже пытался определить их как лигеров, но потом, когда я попытался напечатать массив размеров животных, они оба имели -1 в качестве своего размера. То, как у меня сейчас получается, дает p0 правильный размер, но не p1.

   public abstract class Animal {
    public int size = -1;   
   }

   public class Tiger extends Animal {

   }

   public class Liger extends Animal {
     public int size = 121;
   }

   public static void main(final String[] args) {

    Animal[] animal = new Animal[10];
    Animal p0 = new Liger();
    p0.size = 11;
    animals[0] = p0;

    Animal p1 = new Liger();
    animals[1] = p1;
  }

Когда я определяю лигеров как животных, p1 получает -1 как его размер вместо 121, который я хочу иметь. Я уверен, что проблема заключается в том, что я называю это Животное вместо лигера, но я не уверен, каков правильный синтаксис, чтобы это исправить. Я хочу, чтобы они могли быть в массиве с тиграми.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019
public abstract class Animal {
    private int size;

    public Animal() {
        size = -1;
    }

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

    public void setSize( int size ) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    public static void main(final String[] args) {

      Animal[] animals  = new Animal[2];
      animals[0] = new Liger(20);
      animals[1] = new Liger();

      for(int i = 0; i < animals.length; ++i) {
          System.out.println("Size : " + animals[i].getSize());
      }   
    }
}

public class Tiger extends Animal {
      public Tiger() {
         super();    
      }

      public Tiger(int size) {
         super(size);
      }
}

public class Liger extends Animal {
      public Liger() {
         super();    
      }

      public Liger(int size) {
         super(size);
      }  
}

Это просто базовое руководство, просто для справки. Дело в том, что поведение может быть переопределено в последующих дочерних классах. Учебник по Java

0 голосов
/ 17 октября 2019

Пожалуйста, что такое fs в вашей строке

Animal p1 = fs.new Liger();

Кстати, посмотрите на этот код и скажите мне, если он делает то, что вы ищете.

public static void main(final String[] args) {

    Animal[] animals = new Animal[10];

    Animal p0 = new Liger();
    p0.size = 11;
    animals[0] = p0;

    Animal p1 = new Liger();
    animals[1] = p1;

    System.out.println("p0.size "+ p0.size); // call as a superclass instance
    System.out.println("real p0.size "+ ((p0 instanceof Liger) ? ((Liger)p0).size : ((Tiger)p0).size) ); // cast to call the effective instance of the subclass
    System.out.println("p1.size "+ p1.size); // call as a superclass instance
    System.out.println("real p1.size "+ ((p1 instanceof Liger) ? ((Liger)p1).size : ((Tiger)p1).size) ); // cast to call the effective instance of the subclass


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