Start here. This is the direct spoken answer to practice first.
Why this question matters
Composition builds behavior by giving an object focused collaborators and delegating work to them. It is often safer than inheritance because each behavior can vary without exposing base-class internals or creating subclass combinations.
Preferring composition means building behavior from focused collaborators instead of inheriting mainly for code reuse. For a report exporter, I might compose an IReportFormatter, IStorageWriter, and INotificationSender instead of creating PdfEmailExporter, PdfBlobExporter, CsvEmailExporter, and more subclasses. The coordinator owns the workflow while each collaborator owns one variation. Dependencies are explicit and each part can be tested through its contract.