1.final的作用
final的作用是使被修飾的目標無法改變。final可以修飾變量傀蚌,方法和類基显。
2.final修飾參數(shù)
Student對象
public class Student
{
private int id;
private String name;
private int age;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override
public String toString()
{
return "name:"+this.name+" age:"+this.age;
}
}
測試例子
/**
* @author LGY
* @time 2017-11-9
* @action
* Java編程思想第四版140頁是這么描述的,“對應基本類型善炫,final使數(shù)值恒定不變撩幽,對應對象引用,final使引用恒定不變箩艺。
* 一旦引用被初始化指向一個對象窜醉,就無法再把他改為指向另一個對象。然而對象其自身卻是可以被修改的艺谆。
* Java并未提供使任何對象恒定不變的途徑(但是可以自己編寫類以取得使對象恒定不變的效果)榨惰。這一限制同樣適用于數(shù)組,它也是對象”
*
* 對應上面這句話静汤,我肯可以理解一旦final修飾了引用指向了一個對象琅催,那么這個引用就不能在指向其他對象了,但是這個對象的成員變量和成員方法卻是可以修改的虫给。
* 如果想讓這個對象成員變量和成員方法都不能被修改藤抡,就需要使成員變量和成員方法被final修飾,這樣就能實現(xiàn)讓對象恒定不變的效果抹估。
* 這里也提到了數(shù)組也是一個對象缠黍,所以數(shù)組也是這個情況。
*
* student本身指向的對象在初始化之后不能修改,但是指向的這個對象的字段可以修改
*/
public class Test2 extends Activity
{
private final int i = 5;
private final Integer it = 5;
private final String string = "hello";
private final Student student = new Student();
private final String[] array= {"aa","bb","cc"};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
sendData(i, it);
Log.i("lgy", "after i:"+i+" it:"+it);
sendDataTestString(string);
Log.i("lgy", "after String:"+string);
student.setAge(18);
student.setName("lgy");
student.setId(1);
sendDataTestObject(student);
Log.i("lgy", "after student:"+student.toString());
sendDataTestArray(array);
Log.i("lgy",array[0]+array[1]+array[2]);
}
private void sendData(int i,Integer it)
{
i++;
it++;
Log.i("lgy", "i:"+i+" it:"+it);
}
private void sendDataTestString(String str)
{
str = str+" JAVA";
Log.i("lgy", "String:"+str);
}
private void sendDataTestObject(Student student)
{
student.setAge(24);
student.setName("LGY");
Log.i("lgy", "student:"+student.toString());
}
private void sendDataTestArray(String[] array)
{
String temp = "";
for (int i = 0; i < array.length; i++)
{
array[i] = "ddd"+i;
}
for (int i = 0; i < array.length; i++)
{
temp = temp+array[i];
}
Log.i("lgy",temp);
//這里由于array是參數(shù)的引用药蜻,也指向this.array指向的對象瓷式,但是他并沒有被final修飾,所以可以改變它指向的對象谷暮,這個參數(shù)生命周期是在這個方法執(zhí)行完成后就消亡了
//所以如果我再給array初始化蒿往,那么這個引用就會指向另一個對象,那么修改array將不會改變this.array的值
String[] strings= {"jj","jj","jj"};
array = strings;
temp = "";
for (int i = 0; i < array.length; i++)
{
temp = temp+this.array[i];
}
Log.i("lgy",temp);
//報錯The final field Test2.array cannot be assigned湿弦,驗證了一旦引用被初始化指向一個對象瓤漏,就無法再把他改為指向另一個對象
// String[] strings2= {"jj","jj","jj"};
// this.array = strings;
}
}
/*11-16 10:01:19.946: I/lgy(14797): i:6 it:6
11-16 10:01:19.946: I/lgy(14797): after i:5 it:5
11-16 10:01:19.946: I/lgy(14797): String:hello JAVA
11-16 10:01:19.946: I/lgy(14797): after String:hello
11-16 10:01:19.946: I/lgy(14797): student:name:LGY age:24
11-16 10:01:19.946: I/lgy(14797): after student:name:LGY age:24
11-16 10:01:19.946: I/lgy(14797): ddd0ddd1ddd2
11-16 10:01:19.946: I/lgy(14797): ddd0ddd1ddd2
11-16 10:01:19.946: I/lgy(14797): ddd0ddd1ddd2*/
3.final修飾方法
public class Person
{
private String name;
private int age;
private int id;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public int getId()
{
return id;
}
public final void setId(int id)
{
this.id = id;
}
}
測試例子
/**
* @author LGY
* @time 2017-11-14
* @action
* 下面這段話摘自《Java編程思想》第四版第143頁:
*
* “使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義.
* 第二個原因是效率蔬充。在早期的Java實現(xiàn)版本中蝶俱,會將final方法轉為內嵌調用。
* 但是如果方法過于龐大饥漫,可能看不到內嵌調用帶來的任何性能提升榨呆。在最近的Java版本中,不需要使用final方法進行這些優(yōu)化了庸队』撸“
* 因此,只有需要防任何繼承類修改該方法的情況下彻消,才考慮使用final.
*/
public class Student extends Person
{
@Override
public int getId()
{
return super.getId();
}
//因為在父類Person中將setId
// public void setId(int id)
// {
// this.id = id;
// }
}
4.final修飾類
public final class Person
{
private String name;
private int age;
private int id;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
}
測試例子
/**
* @author LGY
* @time 2017-11-14
* @action
* 當用final修飾一個類時竿拆,表明這個類不能被繼承。
* final類中的成員變量可以根據(jù)需要設為final宾尚,但是要注意final類中的所有成員方法都會被隱式地指定為final方法丙笋。
* 可以看出,下面的類無法繼承Person
*/
//public class Test extends Person
//{
//
//}
5.源碼地址
http://download.csdn.net/download/lgywsdy/10120946