Like everything else in the Wolfram Language, notebooks are ultimately symbolic expressions. When you edit notebooks—or apply high-level programmatic functions—the Wolfram Language automatically updates these expressions. But if you look at the lowest level—say by opening a notebook file as text—you will see the underlying expressions, in which formatting constructs are represented as a hierarchy of low-level symbolic "boxes".
Notebook — low-level symbolic representation for a notebook
Cell — low-level representation for a cell in a notebook
RowBox — low-level representation for a row of arbitrary elements
GridBox — low-level representation of an arbitrary 2D layout
StyleBox — low-level wrapper specifying styles and style options to apply