Java基礎--10.final,static,權限修飾符

一. final

1.1 概述

​ 那麼我們能不能隨意的繼承API中提供的類,改寫其內容呢?顯然這是不合適的。爲了避免這種隨意改寫的情況,Java提供了 final 關鍵字,用於修飾不可改變內容。

final: 不可改變。可以用於修飾類、方法和變量。

​ 類:被修飾的類,不能被繼承。

​ 方法:被修飾的方法,不能被重寫。

​ 變量:被修飾的變量,不能被重新賦值。

1.2 使用方式

1.2.1 修飾類

​ final修飾的類,不能被繼承。

final class 類名 {
}

​ 查詢API發現像 public final class String 、 public final class Math 、 public final class Scanner

等,很多我們學習過的類,都是被final修飾的,目的就是供我們使用,而不讓我們所以改變其內容。

1.2.2 修飾方法

​ final修飾的方法,不能被重寫。

修飾符 final 返回值類型 方法名(參數列表){ 
	//方法體 
}

1.2.3 修飾變量

1.2.3.1 局部變量

1.基本類型

​ 基本類型的局部變量,被final修飾後,只能賦值一次,不能再更改。

public class FinalDemo1 { 
    public static void main(String[] args) { 
        // 聲明變量,使用final修飾 
        final int a; 
        // 第一次賦值 
        a = 10; 
        // 第二次賦值(錯誤)
        a = 20; // 報錯,不可重新賦值 
        // 聲明變量,直接賦值,使用final修飾 
        final int b = 10; 
        // 第二次賦值 
        b = 20; // 報錯,不可重新賦值 
    } 
}

​ 錯誤示例:(同一個變量不能再複製)

final int c = 0; 
for (int i = 0; i < 10; i++) { 
	c = i; 
	System.out.println(c); 
}

​ 正確示例:不同的變量

for (int i = 0; i < 10; i++) { 
    final int c = i; 
    System.out.println(c); 
}

2.引用類型

​ 引用類型的局部變量,被final修飾後,只能指向一個對象,地址不能再更改。但是不影響對象內部的成 員變量值的修改.

public class FinalDemo2 { 
    public static void main(String[] args) { 
        // 創建 Person 對象 
        final Person p = new Person(); 
        // 創建 另一個 Person對象 
        p = new Person(); // 報錯,指向了新的對象,地址值改變。 
        // 修改對象成員變量的值,可以修改 
        p.name("張三"); 
    } 
}
1.2.3.2 成員變量

​ 成員變量涉及到初始化的問題,初始化方式有兩種,只能二選一:

​ a.顯示初始化(在定義成員變量的時候立馬賦值);

public class Student { 
    final int num = 10; 
}

​ b.構造方法初始化(在構造方法中賦值一次);

public class Student { 
    final int num = 10; 
    final int num2; 
    public Student() { 
        this.num2 = 20;  
    } 
}

​ 備註:被final修飾的常量名稱,一般都有書寫規範,所有字母都大寫

二. static

2.1 概述

​ 關於 static 關鍵字的使用,它可以用來修飾的成員變量和成員方法,被修飾的成員是屬於類的,而不是單單是屬於某個對象的。也就是說,既然屬於類,就可以不靠創建對象來調用了。

2.2 定義和使用格式

2.2.1 靜態變量

​ 當 static 修飾成員變量時,該變量稱爲靜態變量。該類的每個對象都共享同一個類變量的值。任何對象都可以更改該類變量的值,但也可以在不創建該類的對象的情況下對類變量進行操作。

​ **靜態變量:**使用 static關鍵字修飾的成員變量。

static 數據類型 變量名;
public class Chinese { 
    String name; 
    int age; 
    static String country; 
    public Chinese() { 
    }
    public Chinese(String name, int age) { 
        this.name = name; 
        this.age = age; 
    }
    public void show() { 
        System.out.println(name + "," + age + "," + country); 
    } 
}

//測試類
public class Demo08 { 
    public static void main(String[] args) {
        // 類名.靜態成員變量名 
        Chinese.country = "中國"; 
        System.out.println(Chinese.country);
        
        Chinese c1 = new Chinese("范冰冰", 20); 
        c1.country = "中國"; 
        c1.show(); // 范冰冰, 20, 中國
    }
}

**static修飾成員變量好處:**static修飾的成員變量會存儲在靜態區,只有一份,節省內存,可以使用類名調用。

​ 2.2.2 靜態方法

​ 當 static 修飾成員方法時,該方法稱爲靜態方法 。靜態方法在聲明中有 static ,建議使用類名來調用,而不需要創建類的對象。調用方式非常簡單。

​ **靜態方法:**使用 static關鍵字修飾的成員方法,習慣稱爲靜態方法。

修飾符 static 返回值類型 方法名 (參數列表) { 
    // 執行語句 
}

​ 靜態方法調用的注意事項:

​ 靜態方法可以直接訪問靜態變量和靜態方法。

​ 靜態方法不能直接訪問普通成員變量或成員方法。反之,成員方法可以直接訪問靜態變量或靜態方法。

​ 靜態方法中,不能使用this關鍵字。

​ 備註:靜態方法只能訪問靜態成員

​ 2.2.3 調用格式

​ 被static修飾的成員可以並且建議通過類名直接訪問。雖然也可以通過對象名訪問靜態成員。

// 訪問類變量 
類名.類變量名; 
// 調用靜態方法 
類名.靜態方法名(參數)//對象名調用
類型 對象名 = new 類型();
對象名.類變量名;
對象名.靜態方法名(參數);

​ 2.2.4 靜態代碼塊

靜態代碼塊:定義在成員位置,使用static修飾的代碼塊{ }。

​ 位置:類中方法外。

​ 執行:隨着類的加載而執行且執行一次。

public class ClassName { 
    static { 
        // 執行語句 
    } 
}

​ 給靜態變量進行初始化賦值:

public class Game { 
    public static int number; 
    public static ArrayList<String> list; 
    static { 
        // 給類變量賦值 
        number = 2; 
        list = new ArrayList<String>(); 
        // 添加元素到集合中 
        list.add("張三"); 
        list.add("李四"); 
    } 
}

​ static 關鍵字,可以修飾變量、方法和代碼塊。在使用的過程中,其主要目的還是想在不創建對象的情況

下,去調用方法。

三. 權限修飾符

​3.1 概述

​ 在Java中提供了四種訪問權限,使用不同的訪問權限修飾符修飾時,被修飾的內容會有不同的訪問權限,

​ public:公共的。

​ protected:受保護的

​ default:默認的

​ private:私有的

​ public > protected > default > private

3.2 不同權限的訪問能力

public protected default private
同一類中 true true true true
同一包中(子類與無關類) true true true
不同包的子類 true true
不同包的無關類 true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章