I beleive val is like constant in Java right?
If you mean final, then yes in the sense that the value can't be changed. See here:
Variables
Read-only local variables are defined using the keyword val. They can be assigned a value only once.
...
Variables that can be reassigned use the var keyword.
and here:
Declaring properties
Properties in Kotlin classes can be declared either as mutable, using the var keyword, or as read-only, using the val keyword.
Continuing with your question:
Then how can we change it's value if it is recommended to use it instead of var?
You can't, that's the point. It says to the programmer reading it (and the compiler and JVM) that the value won't be changed.
I understand that functional programming is popular in Kotlin. So you may be seeing people saying to use val as part of doing functional programming in general (which prefers creating new, updated data objects to modifying the state of a data object).