java基礎知識點
技術標籤:Java
【前言、入門程式、常量、變數】
1. Java程式開發三步驟:
編寫、編譯、執行。
2. 6種類型的常量
常量
在程式執行期間,固定不變的量。
常量的分類
- 字串常量:凡是用雙引號引起來的部分,叫做字串常量。例如:“abc”、“Hello”、“123”
- 整數常量:直接寫上的數字,沒有小數點。例如:100、200、0、-250
- 浮點數常量:直接寫上的數字,有小數點。例如:2.5、-3.14、0.0
- 字元常量:凡是用單引號引起來的單個字元,就做字元常量。例如:‘A’、‘b’、‘9’、‘中’
- 布林常量:只有兩種取值。true、false。
- 空常量:null。代表沒有任何資料。
3. 8種基本資料型別的變數
變數
程式執行期間,內容可以發生改變的量。
格式
建立一個變數並且使用的格式:
資料型別 變數名稱; // 建立了一個變數
變數名稱 = 資料值; // 賦值,將右邊的資料值,賦值交給左邊的變數
資料型別 變數名稱 = 資料值; // 在建立一個變數的同時,立刻放入指定的資料值
注意事項
- 如果建立多個變數,那麼變數之間的名稱不可以重複。
- 對於float和long型別來說,字母后綴F和L不要丟掉。
- 如果使用byte或者short型別的變數,那麼右側的資料值不能超過左側型別的範圍。
- 沒有進行賦值的變數,不能直接使用;一定要賦值之後,才能使用。
- 變數使用不能超過作用域的範圍。【作用域】:從定義變數的一行開始,一直到直接所屬的大括號結束為止。
- 可以通過一個語句來建立多個變數,但是一般情況不推薦這麼寫。
day02 【資料型別轉換、運算子、方法入門】
1. 強制轉換
轉換格式:
資料型別 變數名 = (資料型別)被轉資料值;
注意事項
- 強制型別轉換一般不推薦使用,因為有可能發生精度損失、資料溢位。
- byte/short/char這三種類型都可以發生數學運算,例如加法“+”.
- byte/short/char這三種類型在運算的時候,都會被首先提升成為int型別,然後再計算。
- boolean型別不能發生資料型別轉換
2. ASCII編碼表
'0'--->48;
'A'--->65;
'a'--->97;
3. 運算子++
++在前,先加後用;++ 在後,先用後加
4. 三元運算子
格式:
資料型別 變數名 = 布林型別表示式?結果1:結果2
day03【 流程控制語句】
1. 判斷語句–if…else if…else
格式:
if (判斷條件1) {
執行語句1;
} else if (判斷條件2) {
執行語句2;
}
...
}else if (判斷條件n) {
執行語句n;
} else {
執行語句n+1;
}
2. 選擇語句switch
格式:
switch(表示式) {
case 常量值1:
語句體1;
break;
case 常量值2:
語句體2;
break;
...
default:
語句體n+1;
break;
}
case的穿透性(月份對應的季節)
注意事項
-
多個case後面的數值不可以重複。
-
switch後面小括號當中只能是下列資料型別:
基本資料型別:byte/short/char/int
引用資料型別:String字串、enum列舉 -
switch語句格式可以很靈活:前後順序可以顛倒,而且break語句還可以省略。
“匹配哪一個case就從哪一個位置向下執行,直到遇到了break或者整體結束為止。”
3. for迴圈
格式:
for(初始化表示式①; 布林表示式②; 步進表示式④){
迴圈體③
}
4. while 迴圈
格式:
初始化表示式①
while(布林表示式②){
迴圈體③
步進表示式④
}
5. do…while迴圈
格式:
初始化表示式①
do{
迴圈體③
步進表示式④
}while(布林表示式②);
6. break 和continue
break 跳出迴圈;continue跳過本次迴圈,繼續下一個迴圈
7. 巢狀迴圈
經典題型: 直角三角形、倒三角型、等腰三角形的*
號
day04【 Idea、方法】
1. idea常用快捷鍵
快捷鍵 | 功能 |
---|---|
Alt+Enter | 匯入包,自動修正程式碼 |
Ctrl+Y | 刪除游標所在行 |
Ctrl+D | 複製游標所在行的內容,插入游標位置下面 |
Ctrl+Alt+L | 格式化程式碼 |
Ctrl+/ | 單行註釋 |
Ctrl+Shift+/ | 選中程式碼註釋,多行註釋,再按取消註釋 |
Alt+Shift+上下箭頭 | 移動當前程式碼行 |
Alt+V→Enter Presentation Mode→exit xx | 幻燈片展示當前類 |
Alt+1 → Ctrl+shift+←/→ | 切換檢視,能否看到左側project,移動分割線 |
Ctrl+shift+enter | 收尾,包括新增行尾分號,大括號等 |
shift+enter | 向下開闢一行,開始新一行,相當於vim的o |
Fn+end | 跳轉行尾 |
Fn+home | 跳轉行首 |
Ctrl+F4 | 關閉當前檔案 |
Alt+滑鼠勾選垂直程式碼 | 垂直選擇程式碼 |
Ctrl+←/→ | 游標向前/後的下一個單詞跳轉 |
ctrl+shift++/- | 收起或者展開程式碼塊{} |
2. 定義方法
方法其實就是若干語句的功能集合。
格式(三要素):
修飾符 返回值型別 方法名(引數列表){
//程式碼省略...
return 結果;
}
注意事項
對於有返回值的方法,可以使用單獨呼叫、列印呼叫或者賦值呼叫。
但是對於無返回值的方法,只能使用單獨呼叫,不能使用列印呼叫或者賦值呼叫。
3. 方法呼叫流程圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-0zuKFOhu-1611036931564)(img\方法呼叫圖解.jpg)]
4. 方法的過載
-
方法過載**:指在同一個類中,允許存在一個以上的同名方法,只要它們的引數列表不同即可,與修飾符和返回值型別無關。
-
引數列表:個數不同,資料型別不同,順序不同。
-
過載方法呼叫:JVM通過方法的引數列表,呼叫不同的方法。
day05【陣列】
1. 容器
將多個數據儲存到一起,每個資料稱為該容器的元素。
2. 陣列概念
陣列就是儲存資料長度固定的容器,保證多個數據的資料型別要一致。
3. 陣列的定義
陣列的特點
- 陣列是一種引用資料型別
- 陣列當中的多個數據,型別必須統一
- 陣列的長度在程式執行期間不可改變
陣列的初始化
在記憶體當中建立一個數組,並且向其中賦予一些預設值。
- 動態初始化:
陣列儲存的資料型別[] 陣列名字 = new 陣列儲存的資料型別[長度];
- 靜態初始化:
資料型別[] 陣列名 = new 資料型別[]{元素1,元素2,元素3...};
靜態簡寫:
資料型別[] 陣列名 = {元素1,元素2,元素3...};
預設值
如果是整數型別,那麼預設為0;
如果是浮點型別,那麼預設為0.0;
如果是字元型別,那麼預設為’\u0000’;
如果是布林型別,那麼預設為false;
如果是引用型別,那麼預設為null。
5. 索引
- 索引:** 每一個儲存到陣列的元素,都會自動的擁有一個編號,從0開始,這個自動編號稱為陣列索引(index),可以通過陣列的索引訪問到陣列中的元素。
6. java虛擬機器的記憶體劃分
區域名稱 | 作用 |
---|---|
暫存器 | 給CPU使用,和我們開發無關。 |
本地方法棧 | JVM在使用作業系統功能的時候使用,和我們開發無關。 |
方法區 | 儲存可以執行的class檔案。 |
堆記憶體 | 儲存物件或者陣列,new來建立的,都儲存在堆記憶體。 |
方法棧 | 方法執行時使用的記憶體,比如main方法執行,進入方法棧中執行。 |
7. 陣列在記憶體中的儲存
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-5fb9fQrI-1611036931566)(img\陣列記憶體圖1.jpg)]
8. 遍歷陣列
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
9. 最大值
public static void main(String[] args) {
int[] arr = { 5, 15, 2000, 10000, 100, 4000 };
//定義變數,儲存陣列中0索引的元素
int max = arr[0];
//遍歷陣列,取出每個元素
for (int i = 0; i < arr.length; i++) {
//遍歷到的元素和變數max比較
//如果陣列元素大於max
if (arr[i] > max) {
//max記錄住大值
max = arr[i];
}
}
System.out.println("陣列最大值是: " + max);
}
10. 陣列反轉
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
/*
迴圈中定義變數min=0最小索引
max=arr.length-1最大索引
min++,max--
*/
for (int min = 0, max = arr.length - 1; min <= max; min++, max--) {
//利用第三方變數完成陣列中的元素交換
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反轉後,遍歷陣列
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
11. 陣列作為方法引數
public static void main(String[] args) {
int[] arr = { 1, 3, 5, 7, 9 };
//呼叫方法,傳遞陣列
printArray(arr);
}
/*
建立方法,方法接收陣列型別的引數
進行陣列的遍歷
*/
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
12. 陣列作為方法返回值
public class Demo12ArrayReturn {
public static void main(String[] args) {
int[] result = calculate(10,20,30);
System.out.println("main方法接收到的返回值陣列是:");
System.out.println(result);
System.out.println("總和:"+result[0]);
System.out.println("平均:"+result[1]);
}
public static int[] calculate(int a, int b, int c){
int sum = a+b+c;
int avg = sum/3;
// 兩個結果都希望進行返回
/*
int[] array = new int[2];
array[0] = sum;// 總和
array[1] = avg;//平均數
*/
int[] array = {sum,avg};
System.out.println(array);
return array;
}
}
day06【類與物件、封裝、構造方法】
1. 面向物件的思想
概念
一種程式設計思想,這裡的物件泛指現實中一切事物,每種事物都具備自己的屬性和行為。面向物件思想就是在計算機程式設計過程中,參照現實中事物,將事物的屬性特徵、行為特徵抽象出來,描述成計算機事件的設計思想。強調的是通過呼叫物件的行為來實現功能。
特點
更符合我們的思考習慣,將複雜的事情簡單化,並將我們從執行者變成指揮者。面向物件的語言中,包含了三大基本特徵,即封裝、繼承和多型。
2. 類和物件
2.1類
- 類:是一組相關屬性和行為的集合。可以看成是一類事物的模板,使用事物的屬性特徵和行為特徵來描述該類事物。
- 屬性:就是該事物的狀態資訊。
- 行為:就是該事物能夠做什麼。
2.2 物件
物件:是一類事物的具體體現。物件是類的一個例項,必然具備該類事物的屬性和行為。
2.3 類和物件的關係
- 類是對一類事物的描述,是抽象的。
- 物件是一類事物的例項,是具體的。
- 類是物件的模板,物件是類的實體。
3. 類的定義
public class ClassName {
//成員變數
//成員方法
}
- 定義類:就是定義類的成員,包括成員變數和成員方法。
- 成員變數:和以前定義變數幾乎是一樣的。只不過位置發生了改變。在類中,方法外。
- 成員方法:和以前定義方法幾乎是一樣的。只不過把static去掉,static的作用在面向物件後面課程中再詳細講解。
4. 類的使用
步驟
通常情況下,一個類並不能直接使用,需要根據類建立一個物件,才能使用。
- 導包:也就是指出需要使用的類,在什麼位置。
import
包名稱.類名稱;
import cn.itcast.day06.demo01.Student
;
對於和當前類屬於同一個包的情況,可以省略導包語句不寫。 - 建立,格式:
類名稱 物件名 =new
類名稱();
Student stu = new Student()
; - 使用,分為兩種情況:
使用成員變數:物件名.成員變數名
使用成員方法:物件名.成員方法名(引數)
(也就是,想用誰,就用物件名點兒誰。)
注意
如果成員變數沒有進行賦值,那麼將會有一個預設值,規則和陣列一樣。
5. 物件的定義
建立物件:
類名 物件名 = new 類名();
使用物件訪問類中的成員:
物件名.成員變數;
物件名.成員方法();
6. 物件記憶體圖
一個物件
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-gWRg7Zmq-1611036931569)(img\2.jpg)]
兩個物件,呼叫同一個方法記憶體圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-3EWg2t9D-1611036931571)(img\3.jpg)]
7. 成員變數和區域性變數區別
- 定義的位置不一樣【重點】
區域性變數:在方法的內部
成員變數:在方法的外部,直接寫在類當中 - 作用範圍不一樣【重點】
區域性變數:只有方法當中才可以使用,出了方法就不能再用
成員變數:整個類全都可以通用。 - 預設值不一樣【重點】
區域性變數:沒有預設值,如果要想使用,必須手動進行賦值
成員變數:如果沒有賦值,會有預設值,規則和陣列一樣 - 記憶體的位置不一樣(瞭解)
區域性變數:位於棧記憶體
成員變數:位於堆記憶體 - 生命週期不一樣(瞭解)
區域性變數:隨著方法進棧而誕生,隨著方法出棧而消失
成員變數:隨著物件建立而誕生,隨著物件被垃圾回收而消失
8.封裝
封裝性在Java當中的體現:
- 方法就是一種封裝
- 關鍵字private也是一種封裝
封裝就是將一些細節資訊隱藏起來,對於外界不可見。
9.private
超出了本類範圍之外就不能再直接訪問了。間接訪問private成員變數,就是定義一對兒Getter/Setter方法
10.Getter/Setter命名規則
對於Getter來說,不能有引數,返回值型別和成員變數對應;
對於Setter來說,不能有返回值,引數型別和成員變數對應;
對於基本型別當中的boolean值,Getter方法一定要寫成isXxx的形式,而setXxx規則不變。
11. this
方法的區域性變數和類的成員變數重名的時候,根據“就近原則”,優先使用區域性變數。如果需要訪問本類當中的成員變數,需要使用格式:
this.成員變數名
通過誰呼叫的方法,誰就是this。
12. 構造方法
構造方法是專門用來建立物件的方法,當我們通過關鍵字new來建立物件時,其實就是在呼叫構造方法。
格式
public 類名稱(引數型別 引數名稱) {
方法體
}
注意事項
- 構造方法的名稱必須和所在的類名稱完全一樣,就連大小寫也要一樣
- 構造方法不要寫返回值型別,連void都不寫
- 構造方法不能return一個具體的返回值
- 如果沒有編寫任何構造方法,那麼編譯器將會預設贈送一個構造方法,沒有引數、方法體什麼事情都不做。
public Student() {}
- 一旦編寫了至少一個構造方法,那麼編譯器將不再贈送。
- 構造方法也是可以進行過載的。
過載:方法名稱相同,引數列表不同。
13.java bean
一個標準的類通常要擁有下面四個組成部分:
- 所有的成員變數都要使用private關鍵字修飾
- 為每一個成員變數編寫一對兒Getter/Setter方法
- 編寫一個無引數的構造方法
- 編寫一個全引數的構造方法
day07【Scanner類、Random類、ArrayList類】
1. API
概念
API(Application Programming Interface),應用程式程式設計介面。
Java API是一本程式設計師的
字典,是
JDK`中提供給我們使用的類的說明文件。
使用步驟
- 開啟幫助文件。
- 點選顯示,找到索引,看到輸入框。
- 你要找誰?在輸入框裡輸入,然後回車。
- 看包。
java.lang
下的類不需要導包,其他需要。 - 看類的解釋和說明。
- 學習構造方法。
- 使用成員方法。
2. Scanner類
2.1什麼是Scanner類
一個可以解析基本型別和字串的簡單文字掃描器。
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
備註:System.in 系統輸入指的是通過鍵盤錄入資料。
2.2 使用步驟
1. 導包
import 包名.類名;
import java.util.Scanner;
2. 建立物件
資料型別 變數名 = new 資料型別(引數列表);
Scanner sc = new Scanner(System.in);
3. 使用
變數名.方法名();
int i = sc.nextInt(); // 接收一個鍵盤錄入的整數
3. 匿名物件
概念
建立物件時,只有建立物件的語句,卻沒有把物件地址值賦值給某個變數。
匿名物件 :沒有變數名的物件
應用場景
作為方法的引數和返回值
-
作為引數
class Test { public static void main(String[] args) { // 普通方式 Student stu = new Student("小強",18); input(stu); //匿名物件作為方法接收的引數 input( new Student("小強",18) ); } public static void input(Student stu){ stu.method(); } }
- 作為返回值
class Test2 { public static void main(String[] args) { // 普通方式 Student stu = newInstance(); } public static Student newInstance(){ //普通方式 //Student stu = new Student("小強",18); //return stu; //匿名物件作為方法返回值 return new Student("小強",18); } }
4. Random類
4.1 作用
它的例項用於生成偽隨機數
4.2 使用步驟
//1. 導包
import java.util.Random;
public class Demo01_Random {
public static void main(String[] args) {
//2. 建立鍵盤錄入資料的物件
Random r = new Random();
for(int i = 0; i < 3; i++){
//3. 隨機生成一個數據
int number = r.nextInt(10);
//4. 輸出資料
System.out.println("number:"+ number);
}
}
}
4. ArrayList類
4.1 定義
java.util.ArrayList
是大小可變的陣列的實現,儲存在內的資料稱為元素。此類提供一些方法來操作內部儲存的元素。 ArrayList
中可不斷新增元素,其大小也自動增長。
4.2 使用步驟
檢視類
java.util.ArrayList <E>
:該類需要 import匯入使後使用。
<E>
,表示一種指定的資料型別,叫做泛型。我們使用一種引用資料型別將其替換即可,表示我們將儲存哪種引用型別的元素。程式碼:ArrayList<String>,ArrayList<Student>
檢視構造方法
public ArrayList()
:構造一個內容為空的集合。
day08【String類、static關鍵字、Arrays類、Math類】
1. String類
概述
java中所有的字串文字都可以被看做是實現此類的例項
特點
- 字串不變: 字串的值在建立後不能被更改
- String物件是不可變的,所以可以被共享
- "abc"等效於char[] data = {‘a’,‘b’,‘c’}
例如:
String str = "abc";
相當於:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底層是靠字元陣列實現的
使用步驟
- 檢視類
java.lang.String
:此類不需要匯入
- 檢視構造方法
public String()
: 初始化新建立的String物件,以使其表示空字元序列public String(char[] value)
: 通過當前引數中的字元陣列來構造新的Stringpublic String(byte[] bytes)
: 通過使用平臺預設字符集解碼當前引數中的位元組陣列來構造新的String
//無參構造
String str = new String();
// 通過字元陣列構造
char chars[] = {'a', 'b', 'c'};
String str2 = new String(chars);
// 通過位元組陣列構造
byte bytes[] = {97,98,99};
String str3 = new String(bytes);
2. String 常用方法
判斷功能的方法
public boolean equals (Object anObject)
: 將次字串與指定物件比較public boolean equalsIgnoreCase(String anotherString)
忽略大小寫
獲取功能的方法
public int length ()
:返回此字串的長度public String concat(String str)
: 將指定的字串拼接到字串的末尾public char charAt(int index)
: 返回指定索引處的char
值public int indexOf(String str)
: 返回指定字串第一次出現在該字串內的索引public String substring(int beginIndex)
: 返回子字串,從beginindex開始擷取字串到字串末尾public String substring (int beginIndex,int endIndex)
:從beginindex
到endIndex
擷取字串,左閉右開
public class String_Demo02 {
public static void main(String[] args) {
//建立字串物件
String s = "helloworld";
// int length():獲取字串的長度,其實也就是字元個數
System.out.println(s.length());
System.out.println("--------");
// String concat (String str):將將指定的字串連線到該字串的末尾.
String s = "helloworld";
String s2 = s.concat("**hello itheima");
System.out.println(s2);// helloworld**hello itheima
// char charAt(int index):獲取指定索引處的字元
System.out.println(s.charAt(0));
System.out.println(s.charAt(1));
System.out.println("--------");
// int indexOf(String str):獲取str在字串物件中第一次出現的索引,沒有返回-1
System.out.println(s.indexOf("l"));
System.out.println(s.indexOf("owo"));
System.out.println(s.indexOf("ak"));
System.out.println("--------");
// String substring(int start):從start開始擷取字串到字串結尾
System.out.println(s.substring(0));
System.out.println(s.substring(5));
System.out.println("--------");
// String substring(int start,int end):從start到end擷取字串。含start,不含end。
System.out.println(s.substring(0, s.length()));
System.out.println(s.substring(3,8));
}
}
轉換功能的方法
public char[] toCharArray ()
: 將此字串轉化為新的字元陣列public byte[] getBytes ()
:使用預設字符集將String編碼轉換為新的位元組陣列public String replace(CharSequence target, CharSequence replacement)
: 將與target
匹配的字串用replacement
字串替換
public class String_Demo03 {
public static void main(String[] args) {
// 建立字串物件
String s = "abcde";
// char[] tpCharArray() 把字串轉換為字元陣列
char[] chs = s.toCharArray();
for(int x = 0; x<chs.length;x++) {
System.out.println(chs[x]);
}
System.out.println("===========");
// byte[] getBytes ():把字串轉換為位元組陣列
byte[] bytes = s.getBytes();
for(int x = 0; x < bytes.length; x++) {
System.out.println(bytes[x]);
}
System.out.println("-----------");
// 替換字母it為大寫IT
String str = "itcast itheima";
String replace = str.replace("it", "IT");
System.out.println(replace); // ITcast ITheima
System.out.println("-----------");
}
}
CharSequence
是一個介面,也是一種引用型別,作為引數型別,可以把String
物件傳遞到方法中。
分割功能的方法
public String[] split(String regex)
: 將此字串按照給定的regex拆分為字串陣列
3. Static關鍵字
概述
用來修飾成員變數和成員方法,被修飾的成員屬於類
定義和使用格式
- 類變數:使用static關鍵字修飾的成員變數
格式:
static 資料型別 變數名;
應用: 學號編號
- 類方法: 使用static關鍵字修飾的成員方法,稱為靜態方法
格式:
修飾符 static 返回值型別 方法名(引數列表){
// 執行語句
}
- 靜態方法呼叫的注意事項:
- 靜態方法可以直接訪問類變數和靜態方法
- 靜態方法不能直接訪問普通成員變數和成員方法
- 靜態方法,不能使用this關鍵字
小貼士:靜態方法只能訪問靜態成員
呼叫格式
被static修飾的成員可以並且建議通過類名直接訪問
靜態原理圖解
static
修飾的內容:
- 是隨著類的載入而載入的,且只加載一次。
- 儲存於一塊固定的記憶體區域(靜態區),所以,可以直接被類名呼叫。
- 它優先於物件存在,所以,可以被所有物件共享。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-rHLlTBic-1611036931573)(img\1.jpg)]
靜態程式碼塊
定義在成員位置,使用static修飾的程式碼塊{},隨著類的載入而執行,且執行一次,優先於main方法和構造方法的執行。
作用:給類變數進行初始化賦值
3. Arrays類
概述
java.util.Arrays
此類包含用來運算元組的各種方法,所有方法均為靜態方法。
運算元組的方法
public static String toString(int[] a)
: 返回指定陣列內容的字串表示形式public static void sort(int[] a)
: 對指定的int 型陣列按數字升序排序 案例:倒序列印
4. Math類
概述
基本數學運算,也是靜態方法,不用建立物件
基本運算方法
public static double abs(double a)
: 返回double
的絕對值public static double ceil(double a)
: 返回大於等於引數的最小的整數public static double floor(double a)
: 返回小於等於引數最大的整數public static long round(double a)
: 返回最接近引數的long(相當於四捨五入)
day09【繼承、super、this、抽象類】
1. 繼承
定義
多個類存在相同的屬性和行為時,共性抽取。
子類繼承父類的屬性和行為,可以直接訪問父類的非私有屬性和行為。
好處
- 提高程式碼的複用性
- 類與類之間產生了關係,是多型的前提。
格式
class 父類 {
...
}
class 子類 extends 父類 {
...
}
繼承後的特點-成員變數
- 成員變數不重名 沒有影響
- 成員變數重名 有同名的成員變數,訪問父類中非私有成員變數時,使用
super
關鍵字,修飾父類成員變數
一般遵循封裝的原則,private修飾成員變數,如何訪問父類的私有成員變數?用父類提供的公共的getXxx和setXxx方法
繼承後的特點-成員方法
- 成員方法不重名 沒有影響
- 成員方法重名 重寫(override)
重寫
子類出現重名的成員方法(返回值型別,方法名和引數列表都相同),訪問是特殊情況,叫方法重寫,又叫覆寫,宣告不變,重新實現。
應用: 新舊手機(super.父類成員方法表示呼叫父類的成員方法)
注意事項
- 子類方法覆蓋父類方法,必須要保證許可權大於等於父類許可權。
- 子類方法覆蓋父類方法,返回值型別、函式名和引數列表都要一模一樣。
繼承後的特點-構造方法
- 構造方法的名字是與類名一致的。所以子類是無法繼承父類構造方法的。
- 構造方法的作用是初始化成員變數的。所以子類的初始化過程中,必須先執行父類的初始化動作。子類的構造方法中預設有一個
super()
,表示呼叫父類的構造方法,父類成員變數初始化後,才可以給子類使用。
繼承的特點
- Java只支援單繼承,不支援多繼承。
- Java支援多層繼承(繼承體系)。
- 子類和父類是一種相對的概念。
2. super和this
父類空間優先於子類物件產生
在每次建立子類物件時,先初始化父類空間,再建立其子類物件本身。目的在於子類物件中包含了其對應的父類空間,便可以包含其父類的成員,如果父類成員非private修飾,則子類可以隨意使用父類成員。程式碼體現在子類的構造方法呼叫時,一定先呼叫父類的構造方法。
super和this的含義:
- super: 代表父類的儲存空間標識(可以理解為父類的引用)
- this: 代表當前物件的引用(誰呼叫就代表誰)
super和this的用法
- 訪問成員
this.成員變數 -- 本類的
super.成員變數 -- 父類的
this.成員方法名() -- 本類的
super.成員方法名() -- 父類的
- 訪問構造方法
this(...) -- 本類的構造方法
super(...) -- 父類的構造方法
子類的每個構造方法中均有預設的super(),呼叫父類的空參構造。手動呼叫父類構造會覆蓋預設的super()。
super() 和 this() 都必須是在構造方法的第一行,所以不能同時出現。
3. 抽象類
概述
我們把沒有方法主體的方法稱為抽象方法。Java語法規定,包含抽象方法的類就是抽象類。
abstract使用格式
- 抽象方法
修飾符 abstract 返回值型別 方法名 (引數列表);
- 抽象類
abstract class 類名字 {
}
抽象的使用
繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須宣告為抽象類。最終,必須有子類實現該父類的抽象方法,否則,從最初的父類到最終的子類都不能建立物件,失去意義。
此時的方法重寫,是子類對父類抽象方法的完成實現,我們將這種方法重寫的操作,也叫做實現方法。
抽象的注意事項
-
抽象類不能建立物件,如果建立,編譯無法通過而報錯。只能建立其非抽象子類的物件。
理解:假設建立了抽象類的物件,呼叫抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
-
抽象類中,可以有構造方法,是供子類建立物件時,初始化父類成員使用的。
理解:子類的構造方法中,有預設的super(),需要訪問父類構造方法。
-
抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
理解:未包含抽象方法的抽象類,目的就是不想讓呼叫者建立該類物件,通常用於某些特殊的類結構設計。
-
抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。
理解:假設不重寫所有抽象方法,則類中可能包含抽象方法。那麼建立物件後,呼叫抽象的方法,沒有意義。
day10【介面、多型】
e