One important difference between languages that provide syntax to encapsulate the definition of user defined data types is whether the syntax requires the specification details to be separated from the implementation details. Ada requires such a separation.
In Ada, the specification information must be placed in the package specification and the implementation details in the package body.
Where must the representation details be placed?
Compare Ada with both C++ and Java in this regard.
Take and defend a position as to whether requiring separation of the specification and representation information for a data type is a good language design decision.