第一章 包
1.1 包
包在作業系統中其實就是一個資料夾。包是用來分門別類的管理技術,不同的技術類放在不同的包下,方便管理和維護。
在IDEA專案中,建包的操作如下:
包名的命名規範:
路徑名.路徑名.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 不同許可權的訪問能力
public | protected | 預設 | 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 String
、public final class Math
、public 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 修飾變數-區域性變數
- 區域性變數——基本型別
基本型別的區域性變數,被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修飾的常量名稱,一般都有書寫規範,所有字母都大寫。