1. 程式人生 > >面向物件中的final和static關鍵字特點總結

面向物件中的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

 void method1(){}

    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物件中的nameage屬性值可更改。

 

1.5 修飾成員變數,需要在建立物件前賦值,否則報錯。(當沒有顯式賦值時,多個構造方法的均需要為其賦值。)

class

 Demo {

//直接賦值

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方法為靜態方法僅僅為程式執行入口,它不屬於任何一個物件,可以定義在任意類中。