In this example although a Person is defined by its name and age a String array is passed in instead. Indeed this might well be what you have (through a main method or an input field) and might think that saves you from having to convert it every time you want a Person but think again.
All you really need to construct a Person is a name (String) and an age (int). So even if you do have those, you still need to convert them to a String array only to have the constructor convert them back. That means knowing how the array is constructed, (name at index 0, age at index 1) which is an irrelevant and possible fragile invariant to have on the Person.
In the same manner you force unrelated dependencies (Calendar?) leading to high coupling, making your code harder to understand (how’s a byte array related to a Person?) and sacrificing constructor chaining. You also risk exposing that burden to any classes related to Person. Especially subclasses which don’t have a choice but to accept those constructors.
In most cases all you need is some factory methods that do the conversions for you. That way you’ve effectively seperated conversion and construction and kept your class clean. Depending on how complicated the conversion is you may realise you need a new class altogether, like a parser.