面向物件中的final和static關鍵字特點總結
1 final的特點
1.1 final修飾類不可以被繼承,但是可以繼承其他類。
class Yy {}
final class Fu extends Yy{} //可以繼承Yy類
class Zi extends Fu{} //不能繼承Fu類
1.2 final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋後可以加final。
class Fu {
// final修飾的方法,不可以被覆蓋,但可以繼承使用
public final
public void method2(){}
}
class Zi extends Fu {
//重寫method2方法
public final void method2(){}
}
1.3 final修飾的變數稱為常量,這些變數只能賦值一次。
final int i = 20;
i = 30; //賦值報錯,final修飾的變數只能賦值一次
1.4 引用型別的變數值為物件地址值,地址值不能更改,但是地址內的物件屬性值可以修改。
final Person p = new Person();
Person p2 = new Person();
p = p2; //final修飾的變數p,所記錄的地址值不能改變
p.name = "小明";//可以更改p物件中name屬性值
p不能為別的物件,而p物件中的name或age屬性值可更改。
1.5 修飾成員變數,需要在建立物件前賦值,否則報錯。(當沒有顯式賦值時,多個構造方法的均需要為其賦值。)
class
//直接賦值
final int m = 100;
//final修飾的成員變數,需要在建立物件前賦值,否則報錯。
final int n;
public Demo(){
//可以在建立物件時所呼叫的構造方法中,為變數n賦值
n = 2016;
}
}
2 static特點
2.1 被static修飾的成員變數屬於類,不屬於這個類的某個物件。(也就是說,多個物件在訪問或修改static修飾的成員變數時,其中一個物件將static成員變數值進行了修改,其他物件中的static成員變數值跟著改變,即多個物件共享同一個static成員變數)
程式碼演示:
class Demo {
public static int num = 100;
}
class Test {
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.num = 200;
System.out.println(d1.num); //結果為200
System.out.println(d2.num); //結果為200
}
}
2.2被static修飾的成員可以並且建議通過類名直接訪問。
訪問靜態成員的格式:
類名.靜態成員變數名
類名.靜態成員方法名(引數)
物件名.靜態成員變數名 ------不建議使用該方式,會出現警告
物件名.靜態成員方法名(引數) ------不建議使用該方式,會出現警告
程式碼演示:
class Demo {
//靜態成員變數
public static int num = 100;
//靜態方法
public static void method(){
System.out.println("靜態方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
3.static注意事項
3.1 靜態內容是優先於物件存在,只能訪問靜態,不能使用this/super。靜態修飾的內容存於靜態區。
class Demo {
//成員變數
public int num = 100;
//靜態方法
public static void method(){
//this.num; 不能使用this/super。
System.out.println(this.num);
}
}
3.2 同一個類中,靜態成員只能訪問靜態成員
class Demo {
//成員變數
public int num = 100;
//靜態成員變數
public static int count = 200;
//靜態方法
public static void method(){
//System.out.println(num); 靜態方法中,只能訪問靜態成員變數或靜態成員方法
System.out.println(count);
}
}
3.3 main方法為靜態方法僅僅為程式執行入口,它不屬於任何一個物件,可以定義在任意類中。