1. Руби не поддерживает методы с разными сигнатурами. Но вместо ошибки он просто принимает последнюю вычисленную. В вашем случае первый метод init затрётся вторым. Для примера поменяйте их местами и вызов
A.new(1)
вернёт ошибку о недостаточности аргументов.
Корни этой проблемы тянутся из динамичности руби и отсутствия pattern matching.
2. initialize нельзя назвать конструктором, потому что конструктором фактически является метод класса new. И вот в
A.new
всегда вызывается метод инстанса initialize, если он присутствует. Но это настолько незначительное замечание, что можно и initialize называть конструктором, ошибка на данном этапе не существена.
По поводу нескольких конструкторов - вот вам шаблон:
def initialize(*args)
if args.length == 1
#initialize method 1
else
#initialize method 2
end
end