Java 的包, 許可權修飾符與final關鍵字

瑪拉_以琳發表於2023-03-01

第一章 包

1.1 包

​ 包在作業系統中其實就是一個資料夾。包是用來分門別類的管理技術,不同的技術類放在不同的包下,方便管理和維護。

在IDEA專案中,建包的操作如下:

aaa.jpg

包名的命名規範

路徑名.路徑名.xxx.xxx
// 例如:com.itheima.oa
  • 包名一般是公司域名的倒寫。例如:黑馬是www.itheima.com,包名就可以定義成com.itheima.技術名稱。
  • 包名必須用”.“連線。
  • 包名的每個路徑名必須是一個合法的識別符號,而且不能是Java的關鍵字。

1.2 導包

什麼時候需要導包?

​ 情況一:在使用Java中提供的非核心包中的類時

​ 情況二:使用自己寫的其他包中的類時

什麼時候不需要導包?

​ 情況一:在使用Java核心包(java.lang)中的類時

​ 情況二:在使用自己寫的同一個包中的類時

1.3 使用不同包下的相同類怎麼辦?

假設demo1和demo2中都有一個Student該如何使用?

程式碼示例:

//使用全類名的形式即可。
//全類名:包名 + 類名
//複製全類名的快捷鍵:選中類名crtl + shift + alt + c 或者用滑鼠點copy,再點選copy Reference
com.itheima.homework.demo1.Student s1 = new com.itheima.homework.demo1.Student();
com.itheima.homework.demo2.Student s2 = new com.itheima.homework.demo2.Student();

第二章 許可權修飾符

2.1 許可權修飾符

​ 在Java中提供了四種訪問許可權,使用不同的訪問許可權修飾符修飾時,被修飾的內容會有不同的訪問許可權,我們之前已經學習過了public 和 private,接下來我們研究一下protected和預設修飾符的作用。

  • public:公共的,所有地方都可以訪問。
  • protected:本類 ,本包,其他包中的子類都可以訪問。
  • 預設(沒有修飾符):本類 ,本包可以訪問。

    注意:預設是空著不寫,不是default

  • private:私有的,當前類可以訪問。
    public > protected > 預設 > private

2.2 不同許可權的訪問能力

publicprotected預設private
同一類中
同一包中的類
不同包的子類
不同包中的無關類

可見,public具有最大許可權。private則是最小許可權。

編寫程式碼時,如果沒有特殊的考慮,建議這樣使用許可權:

  • 成員變數使用private ,隱藏細節。
  • 構造方法使用 public ,方便建立物件。
  • 成員方法使用public ,方便呼叫方法。
小貼士:不加許可權修飾符,就是預設許可權

第三章 final關鍵字

3.1 概述

​ 學習了繼承後,我們知道,子類可以在父類的基礎上改寫父類內容,比如,方法重寫。

如果有一個方法我不想別人去改寫裡面內容,該怎麼辦呢?

Java提供了final 關鍵字,表示修飾的內容不可變。

  • final: 不可改變,最終的含義。可以用於修飾類、方法和變數。

    • 類:被修飾的類,不能被繼承。
    • 方法:被修飾的方法,不能被重寫。
    • 變數:被修飾的變數,有且僅能被賦值一次。

3.2 使用方式

3.2.1 修飾類

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

格式如下:

final class 類名 {
}

程式碼:

final class Fu {
}
// class Zi extends Fu {} // 報錯,不能繼承final的類

查詢API發現像 public final class Stringpublic final class Mathpublic final class Scanner 等,很多我們學習過的類,都是被final修飾的,目的就是供我們使用,而不讓我們所以改變其內容。

3.2.2 修飾方法

final修飾的方法,不能被重寫。
格式如下:

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

程式碼:

class Fu2 {
    final public void show1() {
        System.out.println("Fu2 show1");
    }
    public void show2() {
        System.out.println("Fu2 show2");
    }
}

class Zi2 extends Fu2 {
//    @Override
//    public void show1() {
//        System.out.println("Zi2 show1");
//    }
    @Override
    public void show2() {
        System.out.println("Zi2 show2");
    }
}

3.2.3 修飾變數-區域性變數

  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; // 報錯,不可重新賦值
    }
}

思考,下面兩種寫法,哪種可以透過編譯?

寫法1:

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

寫法2:

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

根據 final 的定義,寫法1報錯!寫法2,為什麼透過編譯呢?因為每次迴圈,都是一次新的變數c。這也是大家需要注意的地方。

3.2.4 修飾變數-成員變數

成員變數涉及到初始化的問題,初始化方式有顯示初始化和構造方法初始化,只能選擇其中一個:

  • 顯示初始化(在定義成員變數的時候立馬賦值)(常用);
public class Student {
    final int num = 10;
}
  • 構造方法初始化(在構造方法中賦值一次)(不常用,瞭解即可)。

    注意:每個構造方法中都要賦值一次!

public class Student {
    final int num = 10;
    final int num2;

    public Student() {
        this.num2 = 20;
//     this.num2 = 20;
    }
    
     public Student(String name) {
        this.num2 = 20;
//     this.num2 = 20;
    }
}
被final修飾的常量名稱,一般都有書寫規範,所有字母都大寫

相關文章