抽象父类调用派生类方法

时间:2019-05-29 21:21:13

标签: java inheritance

所以我想知道类实例是如何构建的。

class Notice < ApplicationRecord
  belongs_to :client
  belongs_to :affiant, optional: true
  before_save :set_date_of_service, :set_default_billing_status, :set_default_affiant

class Affiant < ApplicationRecord
  has_many :zip_codes
  has_many :notices

class Client < ApplicationRecord
  has_many :users
  has_many :properties
  has_many :notices
  has_many :documents

输出为:

test0

派生

为什么计数= 0?而不是2?

3 个答案:

答案 0 :(得分:4)

因为您有两个名为count的变量。 test中的一个在derive中可见(但阴影)。从int count中删除derive,并在protected中将其标记为test

答案 1 :(得分:1)

首先调用超类构造函数。它调用count()两次。通过多态,将调用count()中的derive,将count递增到2。递增的是count中的derive变量,因为简单名称count在子类中的含义。 count中的test变量被count中的derive隐藏。

但是,print语句引用超类中的count范围,该类仍然是0

请注意,当超类​​构造函数完成时,子类构造函数主体即可最终执行。这包括为所有实例变量提供初始值。在这里,即使count已经是2,它还是被“初始化”为0。因此,即使您在子类构造函数中添加了一条print语句,那里的0仍将得到count

要获得count中的2,请删除count中的derive并将count中的test更改为{{1 }}或package-private(无访问修饰符)。这将使protected中的变量count() count递增。

答案 2 :(得分:1)

派生的计数为2,而测试的计数始终为0,因为您称为count()是派生的方法,而不是测试的方法。