 <p>You are not changing which object is being referred to by the parameter (which is not allowed here). Instead you are changing the <em>state</em> of the object (which <strong><em>is</em></strong> allowed here).</p> <p>In other words, when you pass your e1 EmployeeBean object into the method, the x parameter refers to the same object that e1 refers to, and within the method, this cannot change, and so you can't do this:</p> <pre><code>public EmployeeBean changeFinalvalue(final EmployeeBean x) { x = new EmployeeBean(); // changing the reference is not allowed! return x; } </code></pre> <p>But what you're doing -- changing the state of the object -- is allowed.</p> <p>The only way that I know to prevent problems like this is to make a deep copy of the object passed in as parameter and work on the copy/clone object. You could also make the EmployeeBean immutable, but then it wouldn't be much of a Bean, now would it?</p> <p>Edit: I figured that this question has had to have been asked here <em>many</em> times, and on a little searching, I've found that of course it has. Please look at these links for a good discussion on this. Note that this is a general issue about final variables whether they are method parameters or class fields:<br> <a href="http://stackoverflow.com/questions/4197494/java-final-keyword-for-variables">java-final-keyword-for-variables</a><br> <a href="http://stackoverflow.com/questions/4012167/java-final-modifier">java-final-modifier</a></p>