Difference between subscribe and publishes in Java HiveMQ Client

What is the difference between the subscribe(..) methods and the publishes(..) method(s) in the HiveMQ Java Client library?

When I use subscribe(...), I know it will send a SUBSCRIBE to the MQTT broker in some way, but does the same (or similar) happen when I do a publishes(...), or is it completely client side?

If the latter, does that mean I could connect to a persistent session and use publishes(...) to process ANY incoming messages that the broker may have queued up for me? As in, does publishes(...) automatically get all messages that that client got sent by the broker, without having to explicitly subscribe?

For example, say I have an IoT device that has extremely low bandwidth and power constraints. I turn the device on, it connects, sets up a persistent session, and subscribes to a topic. Then, I turn the device off and then on again. It connects, sees that a persistent session exists, so does NOT subscribe. No messages will be processed by this client now (even though the broker seems to queue them and deliver them), because the subscribe code was what hooked up the callback logic. Is using publishes the way to get around this? Is there a different way to have that callback logic hooked up without explicitly calling subscribe()?

I would think that device connecting to broker and subscribing to topic are two different activities. So persistent connection will enable not requiring establishing an underlying TCP connection, subscribing to a topic may still be needed, have you tried subscribing again ?