在編程的過(guò)程中,我們總是會(huì)遇到final關(guān)鍵字,那么我們對(duì)final怎么理解呢,下面是一點(diǎn)粗淺認(rèn)識(shí),和大家共享。
package zy.pro.jbd.demo;
public class FinalDemo {
final int numInt1=16;
final String str="zy";
final String str1;
注意:str1在此沒(méi)有初始化,那么必須要在構(gòu)造函數(shù)中初始化,否則要報(bào)錯(cuò)。也就是說(shuō),final變量必須要進(jìn)行初始化。
public FinalDemo() {
str1="zy";
}
public static void main(String[] args){
System.out.println("-------------------------------------------------");
}
public void executeFinalTest(){
}
private void testFinalInt(){
numInt1+=1;
上面,我們定義了numInt1為final變量,在次將會(huì)出現(xiàn)一個(gè)錯(cuò)誤:cannot assign a final value to final variable numInt1 at line 24
由此可見(jiàn),如果一個(gè)基本型別的變量被定義成了final,那么此變量將不能再被改變。
System.out.println(numInt1);
}
private void testFinalString(){
str=str+"aaaaa";
此處同樣也會(huì)報(bào)錯(cuò)。
System.out.println(str);
}
}
我們?cè)僮饕粋€(gè)測(cè)試:
(1)先創(chuàng)建一個(gè)類(lèi):A.java
package zy.pro.jbd.testbase;
public class A {
int t=10;
public A() {
}
public void setT(int t){
this.t=t;
}
public int getT(){
return this.t;
}
}
(2)寫(xiě)如下測(cè)試代碼
final A a = new A();
public void testFinalObject() {
a.setT(29);
System.out.println("t: " + a.getT());
}
測(cè)試輸出的結(jié)果是:
t: 29
由此可見(jiàn),結(jié)果發(fā)生了改變,說(shuō)明final定義的變量是可以改變的,但是改變的不是變量的引址(即reference),而是變量的內(nèi)容。
我們?nèi)绻麑?xiě)如下代碼
/*
* some error will be threw
A b=new A();
a=b;
*/
則會(huì)發(fā)生錯(cuò)誤,說(shuō)明final類(lèi)型的對(duì)象不能指向另外一個(gè)同類(lèi)型的對(duì)象上邊說(shuō)的比較亂,我們總結(jié)一下:
總結(jié):
(1)Final 修飾 基本類(lèi)型變量,則此變量是不可改變的
(2)Final 修飾 對(duì)象,則其指向是不能改變的,但是其值是允許改變的.(即對(duì)象中的任一個(gè)屬性發(fā)生改變都意味著此對(duì)象的值發(fā)生了改變)
(3)Final 修飾方法,則此方法將不能被重載,但是能被繼承,也就是說(shuō)在子類(lèi)中可以調(diào)用父類(lèi)的final方法;private方法僅允許在父類(lèi)中調(diào)用.在子類(lèi)中你也可以定義同名的方法,這意味著,private方法對(duì)子類(lèi)來(lái)說(shuō)是不可見(jiàn)的.
附錄:
1) A.java
package zy.pro.jbd.testbase;
public class A {
int t=10;
public A() {
}
public void setT(int t){
this.t=t;
}
public int getT(){
return this.t;
}
public final void finalA(){
System.out.println(" final method finalA");
}
private void privateA(){
System.out.println("private method privateA");
}
private final void privateFinalA(){
System.out.println("private final method privateFinalA");
}
}
2) AA.java 繼承自A.java
package zy.pro.jbd.testbase;
public class AA
extends A {
public AA() {
}
/*
public final void finalA(){
System.out.println(" final method finalA");
}
這幾行代碼是錯(cuò)誤的
*/
private void privateA() {
System.out.println("private method privateA in class AA");
} private final void privateFinalA() {
System.out.println("private final method privateFinalA in class AA");
}
}
3)我的測(cè)試程序FinalDemo.java
package zy.pro.jbd.demo;
/**
* this demo is created to test the usage of the final reserved word
*/
import zy.pro.jbd.testbase.A;
public class FinalDemo {
final int numInt1 = 16;
final String str = "zy";
final String str1;
final A a = new A();
public FinalDemo() {
str1 = "zy";
}
public static void main(String[] args) {
System.out.println("-------------------------------------------------");
FinalDemo fd = new FinalDemo();
fd.executeFinalTest();
}
public void executeFinalTest() {
this.testFinalInt();
this.testFinalString();
this.testFinalObject();
}
private void testFinalInt() {
//numInt1+=1;
System.out.println(numInt1);
}
private void testFinalString() {
//str=str+"aaaaa";
System.out.println(str);
}
public void testFinalObject() {
a.setT(29);
System.out.println("t: " + a.getT());
/*
* some error will be threw
A b=new A();
a=b;
*/
}
}
package zy.pro.jbd.demo;
public class FinalDemo {
final int numInt1=16;
final String str="zy";
final String str1;
注意:str1在此沒(méi)有初始化,那么必須要在構(gòu)造函數(shù)中初始化,否則要報(bào)錯(cuò)。也就是說(shuō),final變量必須要進(jìn)行初始化。
public FinalDemo() {
str1="zy";
}
public static void main(String[] args){
System.out.println("-------------------------------------------------");
}
public void executeFinalTest(){
}
private void testFinalInt(){
numInt1+=1;
上面,我們定義了numInt1為final變量,在次將會(huì)出現(xiàn)一個(gè)錯(cuò)誤:cannot assign a final value to final variable numInt1 at line 24
由此可見(jiàn),如果一個(gè)基本型別的變量被定義成了final,那么此變量將不能再被改變。
System.out.println(numInt1);
}
private void testFinalString(){
str=str+"aaaaa";
此處同樣也會(huì)報(bào)錯(cuò)。
System.out.println(str);
}
}
我們?cè)僮饕粋€(gè)測(cè)試:
(1)先創(chuàng)建一個(gè)類(lèi):A.java
package zy.pro.jbd.testbase;
public class A {
int t=10;
public A() {
}
public void setT(int t){
this.t=t;
}
public int getT(){
return this.t;
}
}
(2)寫(xiě)如下測(cè)試代碼
final A a = new A();
public void testFinalObject() {
a.setT(29);
System.out.println("t: " + a.getT());
}
測(cè)試輸出的結(jié)果是:
t: 29
由此可見(jiàn),結(jié)果發(fā)生了改變,說(shuō)明final定義的變量是可以改變的,但是改變的不是變量的引址(即reference),而是變量的內(nèi)容。
我們?nèi)绻麑?xiě)如下代碼
/*
* some error will be threw
A b=new A();
a=b;
*/
則會(huì)發(fā)生錯(cuò)誤,說(shuō)明final類(lèi)型的對(duì)象不能指向另外一個(gè)同類(lèi)型的對(duì)象上邊說(shuō)的比較亂,我們總結(jié)一下:
總結(jié):
(1)Final 修飾 基本類(lèi)型變量,則此變量是不可改變的
(2)Final 修飾 對(duì)象,則其指向是不能改變的,但是其值是允許改變的.(即對(duì)象中的任一個(gè)屬性發(fā)生改變都意味著此對(duì)象的值發(fā)生了改變)
(3)Final 修飾方法,則此方法將不能被重載,但是能被繼承,也就是說(shuō)在子類(lèi)中可以調(diào)用父類(lèi)的final方法;private方法僅允許在父類(lèi)中調(diào)用.在子類(lèi)中你也可以定義同名的方法,這意味著,private方法對(duì)子類(lèi)來(lái)說(shuō)是不可見(jiàn)的.
附錄:
1) A.java
package zy.pro.jbd.testbase;
public class A {
int t=10;
public A() {
}
public void setT(int t){
this.t=t;
}
public int getT(){
return this.t;
}
public final void finalA(){
System.out.println(" final method finalA");
}
private void privateA(){
System.out.println("private method privateA");
}
private final void privateFinalA(){
System.out.println("private final method privateFinalA");
}
}
2) AA.java 繼承自A.java
package zy.pro.jbd.testbase;
public class AA
extends A {
public AA() {
}
/*
public final void finalA(){
System.out.println(" final method finalA");
}
這幾行代碼是錯(cuò)誤的
*/
private void privateA() {
System.out.println("private method privateA in class AA");
} private final void privateFinalA() {
System.out.println("private final method privateFinalA in class AA");
}
}
3)我的測(cè)試程序FinalDemo.java
package zy.pro.jbd.demo;
/**
* this demo is created to test the usage of the final reserved word
*/
import zy.pro.jbd.testbase.A;
public class FinalDemo {
final int numInt1 = 16;
final String str = "zy";
final String str1;
final A a = new A();
public FinalDemo() {
str1 = "zy";
}
public static void main(String[] args) {
System.out.println("-------------------------------------------------");
FinalDemo fd = new FinalDemo();
fd.executeFinalTest();
}
public void executeFinalTest() {
this.testFinalInt();
this.testFinalString();
this.testFinalObject();
}
private void testFinalInt() {
//numInt1+=1;
System.out.println(numInt1);
}
private void testFinalString() {
//str=str+"aaaaa";
System.out.println(str);
}
public void testFinalObject() {
a.setT(29);
System.out.println("t: " + a.getT());
/*
* some error will be threw
A b=new A();
a=b;
*/
}
}

