1. 程式人生 > >final修飾的方法入參以及入參是基本資料型別和物件的區別

final修飾的方法入參以及入參是基本資料型別和物件的區別

結論:
結論1:基本資料型別,用final修飾之後,無法進行再賦值。也就是值和地址都無法修改
結論2:引用資料型別,用final修飾之後,無法進行物件賦值。也就是物件引用的地址無法修改。
結論3:引用資料型別,用final修飾之後,可以通過方法或者屬性值賦值的方式,修改其物件內屬性的值(如果物件的屬性值是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() + "]";
//		}
//		
//	}
}