From the sdf format spec :
If set to true, all links in the model will collide with each other (except those connected by a joint). Can be overridden by the link or collision element self_collide property. Two links within a model will collide if link1.self_collide OR link2.self_collide. Links connected by a joint will never collide.
From the wiki :
<visual> (optional)
The visual properties of the link. This element specifies the shape of the object (box, cylinder, etc.) for visualization purposes. Note: multiple instances of <visual> tags can exist for the same link. The union of the geometry they define forms the visual representation of the link.
<collision> (optional)
The collision properties of a link. Note that this can be different from the visual properties of a link, for example, simpler collision models are often used to reduce computation time. Note: multiple instances of <collision> tags can exist for the same link. The union of the geometry they define forms the collision representation of the link.
To sum up : Self collide will tell that the elements of the robot can collide with each others, the visual will define the shape of each element in your urdf and the collision their "hitbox".
For further explainations maybe ask on the gazebo forum which is more suitable for your question.