结论:
结论1:基本数据类型,用final修饰之后,无法进行再赋值。也就是值和地址都无法修改
结论2:引用数据类型,用final修饰之后,无法进行对象赋值。也就是对象引用的地址无法修改。
结论3:引用数据类型,用final修饰之后,可以通过方法或者属性值赋值的方式,修改其对象内属性的值(如果对象的属性值是final修饰的,也就无法再赋值了)。也就是对象引用的地址无法修改。
1、斯坦福教授说的好,方法可以比喻成一台机器(面包机),没错,在我的机器(方法)里面,我要的参数加了final(要原料),你给我传过来的参数,机器里面就无法改了,也就是说在机器里的这个参数,一直指向的都是你传进来的参数。
package com.hgh.finaltest;
public class FinalTest {
public static void main(String[] args) {
finalTest(1, 2, "s1", "s2", new StringBuilder("sb1"), new StringBuilder("sb2"), new FinalClass(10, "hhh"));
}
/**
*
* 输出的值:
* str1 value=s1,str1 hashcode=3614
object1 value=sb1,object1 hashcode=366712642
object1 value=sb1新加入的值,object1 hashcode=366712642
finalClass value=FinalClass [age=10, name=hhh],finalClass hashcode=1829164700
finalClass value=FinalClass [age=20, name=ddd],finalClass hashcode=1829164700
结论:
结论1:基本数据类型,用final修饰之后,无法进行再赋值。也就是值和地址都无法修改
结论2:引用数据类型,用final修饰之后,无法进行对象赋值。也就是对象引用的地址无法修改。
结论3:引用数据类型,用final修饰之后,可以通过方法或者属性值赋值的方式,修改其对象内属性的值(如果对象的属性值是final修饰的,也就无法再赋值了)。也就是对象引用的地址无法修改。
* @param i
* @param j
* @param str1
* @param str2
* @param object1
* @param object2
* @param finalClass
*/
public static void finalTest(
final int i, final int j,
final String str1, final String str2,
final StringBuilder object1, final StringBuilder object2,
final FinalClass finalClass){
//以下代码会报错,无法执行,结论1:基本数据类型,用final修饰之后,无法进行再赋值。也就是值和地址都无法修改。The final local variable i cannot be assigned. It must be blank and not using a compound assignment
//i = 8;
System.out.println("str1 value=" + str1 +",str1 hashcode="+str1.hashCode());
//以下代码会报错,无法执行,结论2:引用数据类型,用final修饰之后,无法进行对象赋值。也就是对象引用的地址无法修改。
//str1 = UUID.randomUUID().toString();
//以下代码会报错,无法执行,结论2:引用数据类型,用final修饰之后,无法进行再赋值。也就是地址无法修改。
//str1 = "he llo ";
String str3 = "333";
//str1 = str3;
System.out.println("object1 value=" + object1 +",object1 hashcode="+object1.hashCode());
object1.append("新加入的值");
System.out.println("object1 value=" + object1 +",object1 hashcode="+object1.hashCode());
System.out.println("finalClass value=" + finalClass.toString() +",finalClass hashcode="+finalClass.hashCode());
finalClass.age = 20;
finalClass.name = "ddd";
//以下代码会报错,无法执行,结论2:引用数据类型,用final修饰之后,无法进行对象赋值。也就是对象引用的地址无法修改。
//finalClass = new FinalClass(1, "333");
//结论3:引用数据类型,用final修饰之后,可以通过方法或者属性值赋值的方式,修改其对象内属性的值(如果对象的属性值是final修饰的,也就无法再赋值了)。也就是对象引用的地址无法修改。
System.out.println("finalClass value=" + finalClass.toString() +",finalClass hashcode="+finalClass.hashCode());
}
// public class FinalClass{
//
// public int age;
// public String name;
// public FinalClass() {
// // TODO Auto-generated constructor stub
// }
// public FinalClass(int age,String name) {
// // TODO Auto-generated constructor stub
// this.age =age;
// this.name = name;
// }
// @Override
// public String toString() {
// return "FinalClass [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()="
// + super.toString() + "]";
// }
//
// }
}