How do I find available public methods?
Content entities are different from most other things in that they often do not have methods and proper interfaces, at least not for configurable fields.

In case of content entities and fields, public methods is not really what you actually want to know, what you want is to know about fields and properties. And only when you get to an entity again through a reference then the methods matter.

For an overview, I always refer to the great Entity API Cheat Sheet.

Content entities have a fixed structure, Entity > Field (FieldItemList) > FieldItem -> Property. A property is either scalar or a reference to something else, e.g. another entity, a language object, a date object, ...

For a few specified examples, some useful snippets:

// List of fields that an entity has, the field definitions also have a lot of information like the type.
array_keys($entity-&gt;getFieldDefinitions())

// Use get() instead of the magic __get() on the entity level then you at least get some type hints.
$entity-&gt;get('field_name').

// Get the list of properties a certain field has, use array_keys() again for just the names, but the definitions also have the type and if it's computed or not.
$entity-&gt;getFieldDefinition('field_name')-&gt;getFieldStorageDefinition()-&gt;getPropertyDefinitions()

// Most field types have value property, but e.g. entity references have target_id and the computed entity. as you found. File and Image fields have additional properties like title/alt/description.
$entity-&gt;get('field_name')-&gt;value
$entity-&gt;get('field_name')-&gt;target_id
$entity-&gt;get('field_name')-&gt;entity

// Note that get('value') is not the same as -&gt;value on the field item level, get() returns a typed data object, get('value')-&gt;getValue() is the same as -&gt;value.

// When not specified, the delta 0 is assumed (all fields are a list internally, even something like the node id), you can use array access or the delta to access another delta, make sure it exists.
$entity-&gt;get('field_name')[1]-&gt;value
$entity-&gt;get('field_name')-&gt;get(1)-&gt;value

// When you have an entity reference, you can get the entity type and class like this:
$entity-&gt;get('field_name')-&gt;entity-&gt;getEntityTypeId()
$entity-&gt;get('field_name')-&gt;entity-&gt;getEntityType()-&gt;getClass()
// or 
get_class($entity-&gt;get('field_name')-&gt;entity)

// From there you can look up the interface and type hint against that, to a) make sure you have a valid, loadable reference and get type hints in an IDE:
$file = $entity-&gt;get('field_name')-&gt;entity;
if ($file instanceof \Drupal\file\FileInterface) {
  $file-&gt;getFileUri();
}