Please see the code below:
Public Class TypeTest
Public variable1 As String
End Class
Public Class Form1
Private Sub Form1_Load(ByVal sender As Obj
ByVal actually copies the value of the current variable and pass it to the function. By reference copies the current reference to the function. Let's take your example:
t1 is a reference variable which contains the address of the object of type TypeTest, so when you use ByVal, the address is copied to the function. Eventually you use the same object.
Where it really makes sense is, in case of basic variables like int, float etc.
Example: Int temp =0;
temp is a variable which contains the value 0, so when copied 0 is passed. If you use reference then address of temp is passed (&0) to the function.
To summarize, ByRef makes more sense only in the basic types and not complex types.