Operator overloading was a Fortran 90 thing, and the OOP facilities were added in Fortran 2003, so you have two ways to do the same thing, e.g.:
....
type, public :: qobj
complex(real64), allocatable :: data(:,:)
contains
procedure, private :: mult_matrix, mult_scalar1, mult_scalar2
generic :: operator(*) => mult_matrix, mult_scalar1, mult_scalar2
procedure, private :: write_qobj
generic :: write(formatted) => write_qobj
end type
...
contains
....
subroutine write_qobj(this, unit, iotype, v_list, iostat, iomsg)
class(qobj), intent(in) :: this
integer, intent(in) :: unit
character(*), intent(in) :: iotype
integer, intent(in) :: v_list(:)
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg
....
end subroutine
In Fortran, type-bound procedure is the fancy way of saying method (i.e., passed object or receiver marked with class, dynamic dispatch, etc.).
This post lists some interesting stuff related to OOP in Fortran.