`For example, the three real coordinates of a 3D Point can be packed into a
single variable. First, we define a new type in a derived-type statement
`

type Point real :: x,y,z end type Point

`An object of type Point can be declared in a type declaration statement
`

type(Point) :: A, B

A%x = 1.0 A%y = 2.0 A%z = 3.0

`As an alternative to component-by-component assignment, it is possible to use
a derived type constructor to assign values to the whole object.
The derived type constructor is the type name followed by a paranthesised list
of values,
which will be assigned to the individual components. For example,
the coordinate assignment of A can be solved using
`

A = Point( 1.0, 2.0, 3.0 )

`Assignment between two objects of the same derived type is intrinsically defined
(and is equivalent to component-by-component assignment).
For example, the statement
`

B = A

`Note that, since F90 does not imply any form of storage association,
there is no reason to suppose that objects of type Point
occupy 3 contiguous REAL storage locations.
`

`A new derived type can contain another derived type as one of its components;
the derived type of the components must have already been declared or must
be the type currently being declared.
As an example of ``supertype'' consider
`

type Sphere type(Point) :: center real :: radius end type Sphere type(sphere) :: bubble bubble%radius = 1.0 bubble%center%x = 0.2 bubble%center%y = 0.4 bubble%center%z = 0.6 bubble = Sphere( Point(0.2,0.4,0.6), 1.0 )

print*, bubble

print*, bubble%center%x, bubble%center%y, bubble%center%z, bubble%radius %