所以我想知道类实例是如何构建的。
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?
答案 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()
是派生的方法,而不是测试的方法。