1. 程式人生 > 其它 >java基礎知識點

java基礎知識點

技術標籤:Java

【前言、入門程式、常量、變數】

1. Java程式開發三步驟:

編寫編譯執行

2. 6種類型的常量

常量

在程式執行期間,固定不變的量。

常量的分類

  1. 字串常量:凡是用雙引號引起來的部分,叫做字串常量。例如:“abc”、“Hello”、“123”
  2. 整數常量:直接寫上的數字,沒有小數點。例如:100、200、0、-250
  3. 浮點數常量:直接寫上的數字,有小數點。例如:2.5、-3.14、0.0
  4. 字元常量:凡是用單引號引起來的單個字元,就做字元常量。例如:‘A’、‘b’、‘9’、‘中’
  5. 布林常量:只有兩種取值。true、false。
  6. 空常量:null。代表沒有任何資料。

3. 8種基本資料型別的變數

變數

程式執行期間,內容可以發生改變的量。

格式

建立一個變數並且使用的格式:

	  資料型別 變數名稱; // 建立了一個變數
變數名稱 = 資料值; // 賦值,將右邊的資料值,賦值交給左邊的變數
資料型別 變數名稱 = 資料值; // 在建立一個變數的同時,立刻放入指定的資料值

注意事項

  1. 如果建立多個變數,那麼變數之間的名稱不可以重複。
  2. 對於float和long型別來說,字母后綴F和L不要丟掉。
  3. 如果使用byte或者short型別的變數,那麼右側的資料值不能超過左側型別的範圍。
  4. 沒有進行賦值的變數,不能直接使用;一定要賦值之後,才能使用。
  5. 變數使用不能超過作用域的範圍。【作用域】:從定義變數的一行開始,一直到直接所屬的大括號結束為止。
  6. 可以通過一個語句來建立多個變數,但是一般情況不推薦這麼寫。

day02 【資料型別轉換、運算子、方法入門】

1. 強制轉換

轉換格式:

資料型別 變數名 = (資料型別)被轉資料值;

注意事項

  1. 強制型別轉換一般不推薦使用,因為有可能發生精度損失、資料溢位。
  2. byte/short/char這三種類型都可以發生數學運算,例如加法“+”.
  3. byte/short/char這三種類型在運算的時候,都會被首先提升成為int型別,然後再計算。
  4. 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的穿透性(月份對應的季節)

注意事項

  1. 多個case後面的數值不可以重複。

  2. switch後面小括號當中只能是下列資料型別:
    基本資料型別:byte/short/char/int
    引用資料型別:String字串、enum列舉

  3. 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. 陣列的定義

陣列的特點

  1. 陣列是一種引用資料型別
  2. 陣列當中的多個數據,型別必須統一
  3. 陣列的長度在程式執行期間不可改變

陣列的初始化

在記憶體當中建立一個數組,並且向其中賦予一些預設值。

  1. 動態初始化:
陣列儲存的資料型別[] 陣列名字 = new 陣列儲存的資料型別[長度];
  1. 靜態初始化:
資料型別[] 陣列名 = 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. 類的使用

步驟

通常情況下,一個類並不能直接使用,需要根據類建立一個物件,才能使用。

  1. 導包:也就是指出需要使用的類,在什麼位置。
    import 包名稱.類名稱;
    import cn.itcast.day06.demo01.Student;
    對於和當前類屬於同一個包的情況,可以省略導包語句不寫。
  2. 建立,格式:
    類名稱 物件名 = new 類名稱();
    Student stu = new Student();
  3. 使用,分為兩種情況:
    使用成員變數:物件名.成員變數名
    使用成員方法:物件名.成員方法名(引數)
    (也就是,想用誰,就用物件名點兒誰。)

注意

如果成員變數沒有進行賦值,那麼將會有一個預設值,規則和陣列一樣。

5. 物件的定義

建立物件:

類名 物件名 = new 類名();

使用物件訪問類中的成員:

物件名.成員變數;
物件名.成員方法()

6. 物件記憶體圖

一個物件

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-gWRg7Zmq-1611036931569)(img\2.jpg)]

兩個物件,呼叫同一個方法記憶體圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-3EWg2t9D-1611036931571)(img\3.jpg)]

7. 成員變數和區域性變數區別

  1. 定義的位置不一樣【重點】
    區域性變數:在方法的內部
    成員變數:在方法的外部,直接寫在類當中
  2. 作用範圍不一樣【重點】
    區域性變數:只有方法當中才可以使用,出了方法就不能再用
    成員變數:整個類全都可以通用。
  3. 預設值不一樣【重點】
    區域性變數:沒有預設值,如果要想使用,必須手動進行賦值
    成員變數:如果沒有賦值,會有預設值,規則和陣列一樣
  4. 記憶體的位置不一樣(瞭解)
    區域性變數:位於棧記憶體
    成員變數:位於堆記憶體
  5. 生命週期不一樣(瞭解)
    區域性變數:隨著方法進棧而誕生,隨著方法出棧而消失
    成員變數:隨著物件建立而誕生,隨著物件被垃圾回收而消失

8.封裝

封裝性在Java當中的體現:

  1. 方法就是一種封裝
  2. 關鍵字private也是一種封裝

封裝就是將一些細節資訊隱藏起來,對於外界不可見。

9.private

超出了本類範圍之外就不能再直接訪問了。間接訪問private成員變數,就是定義一對兒Getter/Setter方法

10.Getter/Setter命名規則

對於Getter來說,不能有引數,返回值型別和成員變數對應;
對於Setter來說,不能有返回值,引數型別和成員變數對應;

對於基本型別當中的boolean值,Getter方法一定要寫成isXxx的形式,而setXxx規則不變。

11. this

方法的區域性變數和類的成員變數重名的時候,根據“就近原則”,優先使用區域性變數。如果需要訪問本類當中的成員變數,需要使用格式:
this.成員變數名

通過誰呼叫的方法,誰就是this。

12. 構造方法

構造方法是專門用來建立物件的方法,當我們通過關鍵字new來建立物件時,其實就是在呼叫構造方法。

格式

public 類名稱(引數型別 引數名稱) {
    方法體
}

注意事項

  1. 構造方法的名稱必須和所在的類名稱完全一樣,就連大小寫也要一樣
  2. 構造方法不要寫返回值型別,連void都不寫
  3. 構造方法不能return一個具體的返回值
  4. 如果沒有編寫任何構造方法,那麼編譯器將會預設贈送一個構造方法,沒有引數、方法體什麼事情都不做。
    public Student() {}
  5. 一旦編寫了至少一個構造方法,那麼編譯器將不再贈送。
  6. 構造方法也是可以進行過載的。
    過載:方法名稱相同,引數列表不同。

13.java bean

一個標準的類通常要擁有下面四個組成部分:

  1. 所有的成員變數都要使用private關鍵字修飾
  2. 為每一個成員變數編寫一對兒Getter/Setter方法
  3. 編寫一個無引數的構造方法
  4. 編寫一個全引數的構造方法

day07【Scanner類、Random類、ArrayList類】

1. API

概念

API(Application Programming Interface),應用程式程式設計介面。Java API是一本程式設計師的字典,是JDK`中提供給我們使用的類的說明文件。

使用步驟

  1. 開啟幫助文件。
  2. 點選顯示,找到索引,看到輸入框。
  3. 你要找誰?在輸入框裡輸入,然後回車。
  4. 看包。java.lang下的類不需要導包,其他需要。
  5. 看類的解釋和說明。
  6. 學習構造方法。
  7. 使用成員方法。

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中所有的字串文字都可以被看做是實現此類的例項

特點

  1. 字串不變: 字串的值在建立後不能被更改
  2. String物件是不可變的,所以可以被共享
  3. "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): 通過當前引數中的字元陣列來構造新的String
    • public 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):從beginindexendIndex擷取字串,左閉右開
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. 繼承

定義

多個類存在相同的屬性和行為時,共性抽取。

子類繼承父類的屬性行為,可以直接訪問父類的非私有屬性和行為。

好處

  1. 提高程式碼的複用性
  2. 類與類之間產生了關係,是多型的前提

格式

class 父類 {
	...
}

class 子類 extends 父類 {
	...
}

繼承後的特點-成員變數

  • 成員變數不重名 沒有影響
  • 成員變數重名 有同名的成員變數,訪問父類中非私有成員變數時,使用super關鍵字,修飾父類成員變數

一般遵循封裝的原則,private修飾成員變數,如何訪問父類的私有成員變數?用父類提供的公共的getXxx和setXxx方法

繼承後的特點-成員方法

  • 成員方法不重名 沒有影響
  • 成員方法重名 重寫(override)

重寫

子類出現重名的成員方法(返回值型別,方法名和引數列表都相同),訪問是特殊情況,叫方法重寫,又叫覆寫,宣告不變,重新實現。

應用: 新舊手機(super.父類成員方法表示呼叫父類的成員方法)

注意事項

  1. 子類方法覆蓋父類方法,必須要保證許可權大於等於父類許可權。
  2. 子類方法覆蓋父類方法,返回值型別、函式名和引數列表都要一模一樣。

繼承後的特點-構造方法

  1. 構造方法的名字是與類名一致的。所以子類是無法繼承父類構造方法的。
  2. 構造方法的作用是初始化成員變數的。所以子類的初始化過程中,必須先執行父類的初始化動作。子類的構造方法中預設有一個super() ,表示呼叫父類的構造方法,父類成員變數初始化後,才可以給子類使用。

繼承的特點

  1. Java只支援單繼承,不支援多繼承。
  2. Java支援多層繼承(繼承體系)。
  3. 子類和父類是一種相對的概念。

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 類名字 { 
  
}

抽象的使用

繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須宣告為抽象類。最終,必須有子類實現該父類的抽象方法,否則,從最初的父類到最終的子類都不能建立物件,失去意義。

此時的方法重寫,是子類對父類抽象方法的完成實現,我們將這種方法重寫的操作,也叫做實現方法

抽象的注意事項

  1. 抽象類不能建立物件,如果建立,編譯無法通過而報錯。只能建立其非抽象子類的物件。

    理解:假設建立了抽象類的物件,呼叫抽象的方法,而抽象方法沒有具體的方法體,沒有意義。

  2. 抽象類中,可以有構造方法,是供子類建立物件時,初始化父類成員使用的。

    理解:子類的構造方法中,有預設的super(),需要訪問父類構造方法。

  3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

    理解:未包含抽象方法的抽象類,目的就是不想讓呼叫者建立該類物件,通常用於某些特殊的類結構設計。

  4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。

    理解:假設不重寫所有抽象方法,則類中可能包含抽象方法。那麼建立物件後,呼叫抽象的方法,沒有意義。

day10【介面、多型】

e