Java 很难让我的子类准确覆盖父类

Java 很难让我的子类准确覆盖父类,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我对编码并不陌生,但对多态性/继承性/等等并不陌生。我对静态/动态绑定感到困惑,特别是当我将不同的子类放在一个数组中时会发生什么。我正在学习一些非常简单的动物课程,只是想学习一些基础知识 我也试着将它们定义为狮虎,但当我试着打印动物的大小数组时,它们的大小都是-1。我现在用的方法给出了p0的正确大小,但不是p1 public abstract class Animal { public int size = -1; } public class Tiger ex

我对编码并不陌生,但对多态性/继承性/等等并不陌生。我对静态/动态绑定感到困惑,特别是当我将不同的子类放在一个数组中时会发生什么。我正在学习一些非常简单的动物课程,只是想学习一些基础知识

我也试着将它们定义为狮虎,但当我试着打印动物的大小数组时,它们的大小都是-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。我确信问题在于我把它称为动物而不是狮虎,但我不确定正确的语法是什么。我希望他们能和老虎排成一列。

请问,你的队伍中有什么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


}
公共抽象类动物{
私有整数大小;
公共动物(){
大小=-1;
}
公共动物(整数){
这个。大小=大小;
}
公共无效设置大小(整型大小){
这个。大小=大小;
}
公共int getSize(){
返回大小;
}
公共静态void main(最终字符串[]args){
动物[]动物=新动物[2];
动物[0]=新狮虎(20);
动物[1]=新狮虎();
对于(int i=0;i

这只是一个基本的指导方针,仅供参考。这里的要点是行为可以在后续子类中重写

对不起,那是个打字错误,我把它处理掉了。是的,这就是我要找的。难道没有其他方法可以做到这一点吗?我认为我定义类的方式或存储对象的方式有问题,对我来说,没有其他(更简单的)方式了。这是我知道的最基本的方法。也许反射可以做到这一点,但我对java中的反射一无所知。这不是
多态性的工作方式。应该定义用于初始化对象的
构造函数。有默认构造函数和参数化构造函数。多态性讨论了子类可以覆盖的行为。通常情况下,数据是封装的,方法提供对数据的访问,根据特定的类,这些方法可以具有不同的行为。突出需要研究的术语。非常感谢!我做了构造函数,一切都做得更好。正如我所说的,这不是一个理想的例子,从OO设计的角度来看,不应该被认为是完美的
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);
      }  
}