Organization-wide defaults —specify the default level of access users have to each others’ records. You use organization–wide sharing settings to lock down your data to the most restrictive level, and then use the other sharing tools to selectively give access to other users. For example, you can give all employees access to an object called Candidate to allow anyone to add a candidate to the database. But you can restrict access to Positions so that anyone can see the jobs available but only the employees with the proper permissions can edit them.
Now coming to your scenario,
The permissions on a record are always evaluated according to a combination of object–, field–, and record–level permissions.
When object– versus record–level permissions conflict, the most restrictive settings win.
In your case, you've set OWD of an object as Public Read/Write whereas in Profile you've set it as Read Only. Then the most restrictive access is given. So, in your case User with that Profile will not be able to edit that record.
A user’s baseline permissions on any object are determined by the profile.
If the user has any permission sets assigned, these also set the baseline permissions in conjunction with the profile.
Access to records a user does not own are set first by the organization-wide defaults.
If the organization-wide defaults are anything less than Public Read/Write, you can open access back up to certain roles using the role hierarchy.
You can further expand access, to additional groups of users, using sharing rules.
Finally, each record owner can manually share individual records with other users by using the Share button on the record