Java:构造函数和方法如何使用继承行为

时间:2017-05-23 01:44:44

标签: java inheritance

Java似乎与类构造函数和方法处理继承的方式不一致。

案例1 - 方法:

public class HelloWorld
{
  public static void main(String[] args)
  {
    Bee b = new Bee();
    b.foo();
  }
}

class Insect {
  public void foo() {
    this.bar();
    System.out.println("Insect foo");
  }

  public void bar() {
    System.out.println("Insect bar");
  }
}

class Bee extends Insect {
  @Override
  public void foo() {
    super.foo();
    System.out.println("Bee foo");
  }

  @Override
  public void bar() {
    System.out.println("Bee bar");
  }
}

以上代码输出以下内容:

  

蜜蜂吧

     

Insect foo

     

Bee foo

请注意对" this.bar()"的调用在Insect的foo()方法实际上回过头来调用Bee的bar()方法(而不是调用Insect' s bar()方法)。

案例2 - 构造函数:

public class HelloWorld
{
  public static void main(String[] args)
  {
    Bee i = new Bee(1);
  }
}

class Insect {
  public Insect(int size) {
    this(size, 123);
    System.out.println("Constructor: Insect size");
  }

  public Insect(int size, int height) {
    System.out.println("Constructor: Insect size, height");
  }
}

class Bee extends Insect {
  public Bee(int size) {
    super(size);
    System.out.println("Constructor: Bee size");
  }

  public Bee(int size, int height) {
    super(size, height);
    System.out.println("Constructor: Bee size, height");
  }
}

以上输出如下。

  

构造函数:昆虫大小,高度

     

构造函数:昆虫大小

     

构造函数:蜜蜂大小

注意调用" this(size,123);"在Insect的构造函数中,使用Insect的第二个构造函数而不是bee的第二个构造函数。

总而言之,方法调用返回子类,而构造函数调用保留在超类中。任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:2)

除了关于方法的评论中的正确信息与构造函数不同之外 - 您实际上过度简化事情。

你知道,当你编写构造函数时,如果你打算使用"相同的类"那么你 决定。构造函数(当您使用this()时) - 或者如果您想要调用超类构造函数(使用super())。这里没有中间立场 - 你必须明确这一点!

请记住:构造函数的职责是初始化相应类的对象。如果您在构造函数中调用this(whatever)super(whatever),则可能会产生巨大差异。

编译器无法知道您打算做什么。因此,您 要明确指出您想要调用的其他构造函数。

除此之外 - 让多态像这样启动是没有意义的。您绝对希望对象初始化期望发生时发生。因为错误地初始化对象肯定会在之后创建问题

使构造函数具有多态性的想法基本上意味着您在 runtime 确定要调用的构造函数。但是你已经知道你在X类,并且你必须初始化一个新的X对象。在这里允许多态性没有任何好处。相反 - 这样做会产生非常奇怪和奇怪的问题,而这些问题纯粹只是运行时的!