java學習筆記:二維陣列與面向物件
阿新 • • 發佈:2018-11-17
目標:
- 二維陣列
- 面向物件程式設計
一、二維陣列
二維陣列就是一個元素為一維陣列的陣列。
格式1:
- 資料型別[][] 變數名 = new 資料型別[m][n];
- m表示這個二維陣列有多少個一維陣列
- n表示每一個數組的元素的元素個數
/* 二維陣列:就是元素為一維陣列的一個數組 格式1: 資料型別[][] 變數名 = new 資料型別[m][n]; m:表示這個二維陣列有多少個一維陣列 n:表示每一個一維陣列的元素有多少個。 注意: A:以下格式也可以表示二維陣列 a:資料型別 陣列名[][] = new 資料型別[m][n]; b:資料型別[] 陣列名[] = new 資料型別[m][n]; */ class Array2Demo{ public static void main(String[] args){ // 定義一個二維陣列 int[][] arr = new int[3][2]; // 輸出二位陣列的名稱,是一個地址 System.out.println(arr); //是一個地址 // 輸出二維陣列的第一個元素一位陣列的名稱 System.out.println(arr[0]); //是一個地址 System.out.println(arr[1]); System.out.println(arr[2]); // 輸出二位陣列的元素 System.out.println(arr[0][0]); // 0 } }
格式2:
- 資料型別[][] 變數名 = new 資料型別[m][]
- m表示這個二維陣列有多少個一維陣列
- 沒有直接給出一維陣列的元素個數,可以動態的給出
/* 格式2: 資料型別[][] 變數名 = new 資料型別[m][] m:表示這個二維陣列有多少個一維陣列 沒有直接給出一維陣列的元素個數,可以動態的給出 */ class Array2Demo1{ public static void main(String[] args){ // 定義陣列 int[][] arr = new int[3][]; System.out.println(arr); // 這是一個地址 System.out.println(arr[0]); // null System.out.println(arr[1]); // null System.out.println(arr[2]); // null // 動態的為一個一維陣列分配看空間 arr[0] = new int[2]; arr[1] = new int[3]; arr[2] = new int[1]; System.out.println(arr[0]); // 地址 System.out.println(arr[1]); // 地址 System.out.println(arr[2]); // 地址 System.out.println(arr[0][0]); // 0 System.out.println(arr[0][1]); // 0 System.out.println(arr[1][0]); // 0 // 為陣列賦值 arr[1][0] = 100; arr[1][2] = 200; } }
格式3:
- 資料型別[][] 變數名 = new 陣列型別[][]{{元素...},{元素...},{元素...}};
- 簡化版格式:
- 資料型別[][] 變數名 = {{元素...},{元素...},{元素...}};
- 舉例:int[][] arr = {{1,2,3},{4,6},{6}}
/* 需求:列印楊輝三角形(行數可以鍵盤錄入) 分析:規律 a:任何一行的第一列和最後一列都是1 b:從第三行開始,每一個數據是它上一行的前一列和它上一行的本列之和 步驟: 1. 首先定義一個二維陣列,行數如果是n,我們把列數也先定義為n 2. 給這個二維陣列任何一行的第一列和最後一列賦值為1 3. 按照規律給其他元素賦值: 從第三行開始,每一個數據是它上一行的前一列和它的上一行的本列之和 4. 遍歷這個二維陣列 */ import java.util.Scanner; class Array2Test3{ public static void main(String[] args){ // 建立一個鍵盤錄入物件 Scanner sc = new Scanner(System.in); int n = sc.nextInt(); printArray(n); } /* 列印楊輝三角 兩個明確: 返回型別:void 引數資料:n,int */ public static int printArray(int n){ // 1. 首先定義一個二維陣列,行數如果是n,我們把列數也先定義為n int[][] arr = new int[n][n]; // 2. 給這個二維陣列任何一行的第一列和最後一列賦值為1 for(int x=0;x<arr.length;x++){ for(int y=0;y<arr[x].length;y++){ arr[x][0] = 1; arr[x][x] = 1; } } // 3. 按照規律給其他元素賦值: for(int i=2;i<arr.length;i++){ for(int j=1;j<arr[i].length-1;j++){ arr[i][j] = arr[i-1][j-1] + arr[i-1][j]; } } // 4. 遍歷陣列 for(int x=0;x<arr.length;x++){ for(int y=0;y<x+1;y++){ System.out.print(arr[x][y]+" "); } System.out.println(); } return 0; } }
練習:列印楊輝三角
/*
需求:列印楊輝三角形(行數可以鍵盤錄入)
分析:規律
a:任何一行的第一列和最後一列都是1
b:從第三行開始,每一個數據是它上一行的前一列和它上一行的本列之和
步驟:
1. 首先定義一個二維陣列,行數如果是n,我們把列數也先定義為n
2. 給這個二維陣列任何一行的第一列和最後一列賦值為1
3. 按照規律給其他元素賦值:
從第三行開始,每一個數據是它上一行的前一列和它的上一行的本列之和
4. 遍歷這個二維陣列
*/
import java.util.Scanner;
class Array2Test3{
public static void main(String[] args){
// 建立一個鍵盤錄入物件
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
printArray(n);
}
/*
列印楊輝三角
兩個明確:
返回型別:void
引數資料:n,int
*/
public static int printArray(int n){
// 1. 首先定義一個二維陣列,行數如果是n,我們把列數也先定義為n
int[][] arr = new int[n][n];
// 2. 給這個二維陣列任何一行的第一列和最後一列賦值為1
for(int x=0;x<arr.length;x++){
for(int y=0;y<arr[x].length;y++){
arr[x][0] = 1;
arr[x][x] = 1;
}
}
// 3. 按照規律給其他元素賦值:
for(int i=2;i<arr.length;i++){
for(int j=1;j<arr[i].length-1;j++){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
// 4. 遍歷陣列
for(int x=0;x<arr.length;x++){
for(int y=0;y<x+1;y++){
System.out.print(arr[x][y]+" ");
}
System.out.println();
}
return 0;
}
}
思考:引用型別和數值型別的引數傳遞
- 數值型別:在方法見傳遞的是數值,不改變原有數值
- 引用型別:傳遞的是地址值,改變原有數值。
二、面向物件
我們知道,我們可以將實現某些功能的程式碼封裝到一個方法中,在我們程式設計的過程中,會封裝很多的方法,這時我們可以將我們的方法,繼續封裝成類。當使用某功能時,我們就可以先找到這個類,然後使用這個類中的方法,這就是面向物件思想的程式設計方式。
面向物件思想概述:
當需求單一、或者簡單時,使用面向過程程式設計沒有問題,並且效率也很高。當隨著需求的更改,功能的增多,發現需要面對每一個步驟很麻煩。這時,我們可以把這些步驟和功能進行封裝,封裝時根據不同的功能,進行不同的封裝,功能類似的封裝在一起。這樣結構清晰,使用的時候,找到對應的類就可以了,這就是面向物件的思想。
面向物件思想:
- 面向物件是基於面向過程的程式設計思想
- 面向過程:強調的是每一個功能的步驟
- 面向物件:強調的是物件,然後由物件去呼叫功能
面向物件的思想特點:
- 是一種更符合我們思想習慣的思想
- 可以將複雜的事情簡單化
- 將我們從執行者變成了指揮者
面向物件的開發、設計和特徵:
- 面向物件的開發
- 就是不斷的建立物件,使用物件,指揮物件做事情
- 面向物件的設計
- 其實就是在管理和維護物件之間的關係
- 面向物件的特徵
- 封裝
- 繼承
- 多型
類與物件的關係:
- 類:是一組相關的屬性和行為的集合,是一個抽象的概念
- 物件:是該類事物的具體表現形式,具體存在的個體
- 舉例:類->學生,物件->班長就是一個物件
/*
事物:
屬性:事物的資訊描述
行為:事物的功能
類:
成員變數:事物的屬性
成員方法:書屋的功能
定義一個類,其實就是定義該類的成員變數和成員方法
案例:我們來完成一個學生類的定義
學生事物:
屬性:姓名,年齡,地址
行為:學習,吃飯,睡覺
把事物轉換為對應的類:
學生類:
成員變數:姓名,年齡,地址
成員方法:學習,吃飯,睡覺
成員變數:和以前變數的定義是一樣的格式,但是位置不同,在類中方法外
成員方法:和以前的方法定義是一樣的格式,但是今天把static先去掉
*/
class Student{
// 定義變數
// 姓名
String name;
// 年齡
int age;
// 地址
String address;
// 定義方法
// 學習的方法
public void study(){
System.out.println("學習");
}
// 吃飯的方法
public void eat(){
System.out.println("吃飯");
}
// 睡覺的方法
public void sleep(){
System.out.println("睡覺");
}
}
物件的使用:
/*
在一個java檔案中邪兩個類:一個基本的類,一個測試類。
注意:檔案的名稱和測試類名稱相同
建立物件:
格式:類名 物件名 = new 物件名();
使用成員變數:
格式:物件名.變數名
使用成員方法:
格式:物件名.方法名()
*/
// 基本的類
class Student{
// 定義變數
// 姓名
String name;
// 年齡
int age;
// 地址
String address;
// 定義方法
// 學習的方法
public void study(){
System.out.println("學習");
}
// 吃飯的方法
public void eat(){
System.out.println("吃飯");
}
// 睡覺的方法
public void sleep(){
System.out.println("睡覺");
}
}
// 測試的類
class StudentDemo{
public static void main(String[] args){
// 格式:類名 物件名 = new 類名();
// 建立一個Student類的物件
Student s = new Student();
// 輸出成員變數
System.out.println(s.name+"---"+s.age+"---"+s.address);
// 給成員變數賦值
s.name = "小五";
s.age = 10;
s.address = "上海";
System.out.println(s.name+"---"+s.age+"---"+s.address);
// 呼叫方法
s.study();
s.eat();
}
}
物件的記憶體圖分析:
一個物件的記憶體圖:
兩個物件的記憶體圖:
三個物件的記憶體圖: