Java-數組-面向對象
阿新 • • 發佈:2018-08-21
測試類 style 我們 計數器 java sea 做的 不同 出現
數組的應用練習:
數組的復制:
/* 數組的復制:重點考察是否需要返回值 int[] arr = {1,2,3}; 思路: 1.創建一個和原數組一樣大小的數組 2.遍歷原數組,將每個元素依次賦值給新數組的每個元素 == 比較運算符: 基本數據類型:比較的就是數值 int a = 10;int b = 20; a == b 引用數據類型:比較的是內存地址值 int[] arr = {}; int[] arr2 = {}; arr == arr2 */ public classView CodeCopyArrayDemo{ public static void main(String[] args){ int[] src = {1,2,3}; int[] copy = copyArray(src); //打印源數組 print(src); print(copy); //為了驗證兩個數組變量確實是不同的內存地址值,可以比較 //由於是引用數據類型,== 比較的是它們引用的地址值. System.out.println(src == copy); }public static int[] copyArray(int[] src){ //根據原數組的長度,創建一個新數組 int len = src.length; int[] dest = new int[len]; //遍歷並賦值 for(int i = 0;i<len;i++){ dest[i] = src[i]; } return dest; }public static void print(int[] arr){ for(int i = 0;i<arr.length;i++){ System.out.print(arr[i] + " "); } System.out.println(); } }
數組的合並:
分析:
創建新數組,長度是兩個駐足的長度之和
遍歷第一個數組,依次賦值給目標數組
遍歷第二個數組,依次賦值給目標數組(代碼查看)
/* 合並兩個數組 data1 = [1,2,3] data2 = [4,5,6] 思路: 1.創建一個大的數組:其長度是兩個小數組長度之和. 2.遍歷小數組,依次賦值給大數組的元素 */ public class CombineArray{ public static void main(String[] args){ int[] arr1 = {1,2,3}; int[] arr2 = {4,5,6}; //調用方法,合並兩個數組 print(arr1); print(arr2); int[] dest = combine(arr1,arr2); print(dest); } public static int[] combine(int[] arr1,int[] arr2){ //創建一個大數組,長度是兩個參數數組的長度之和 int[] dest = new int[arr1.length + arr2.length]; //遍歷第一個數組 for(int i = 0;i<arr1.length;i++){ dest[i] = arr1[i]; } //遍歷第二個數組 for(int i = 0;i<arr2.length;i++){ dest[arr1.length + i] = arr2[i]; } return dest; /* //用一個變量記錄目標數組的賦值的位置 int index = 0; //創建一個大數組,長度是兩個參數數組的長度之和 int[] dest = new int[arr1.length + arr2.length]; //遍歷第一個數組 for(int i = 0;i<arr1.length;i++){ dest[index] = arr1[i]; index++; } //遍歷第二個數組 for(int i = 0;i<arr2.length;i++){ dest[index] = arr2[i]; index++; } return dest; */ /* //用一個變量記錄目標數組的賦值的位置 int index = 0; //創建一個大數組,長度是兩個參數數組的長度之和 int[] dest = new int[arr1.length + arr2.length]; //遍歷第一個數組 for(int i = 0;i<arr1.length;i++){ dest[index++] = arr1[i]; // index++; } //遍歷第二個數組 for(int i = 0;i<arr2.length;i++){ dest[index++] = arr2[i]; // index++; } return dest; */ } public static void print(int[] arr){ for(int i = 0;i<arr.length;i++){ System.out.print(arr[i] + " "); } System.out.println(); } }View Code
還有奇偶數索引元素的抽取,數組逆序等問題.(代碼查看)
/* 抽取奇數索引的元素(偶數的自己練習) 分析: 1.得到原始數組中奇數索引的個數, 2.根據奇數索引的個數創建目標數組 3.遍歷原始數組,把奇數索引的元素賦值給目標數組 推算奇數索引個數的過程: 1 0 11 1 111 1 1111 2 11111 2 ... */ public class GetOddIndexElementDemo{ public static void main(String[] args){ int[] src = {1,5,2,7,8,5,6}; print(src); int[] dest = getOddIndex(src); print(dest); } //打印數組元素 public static void print(int[] arr){ for(int i = 0;i<arr.length;i++){ System.out.print(arr[i] + " "); } System.out.println(); } //定義方法,抽取原始數組的奇數索引的元素值. public static int[] getOddIndex(int[] src){ //1.得到原始數組中奇數索引的個數 int len = src.length / 2; //2.根據奇數索引的個數創建目標數組 int[] dest = new int[len]; // int index = 0; // for(int i = 0;i<src.length;i++){ if(i % 2 != 0){ dest[index++] = src[i]; } } return dest; } }View Code
/* 數組的逆序: 兩兩交換!! 次數問題: 元素的個數 / 2 交換兩個變量的值的操作是重復執行的動作. */ public class ReverseArrayDemo{ public static void main(String[] args){ int[] arr = {1,2,3,4,5}; System.out.println("逆序之前:"); print(arr); reverse(arr); System.out.println("逆序之後:"); print(arr); } public static void print(int[] arr){ for(int i = 0;i<arr.length;i++){ System.out.print(arr[i] + " "); } System.out.println(); } //自定義方法,實現數組的逆序: //返回值類型:void //形參列表:int[] public static void reverse(int[] arr){ //計算出兩兩交換的次數 int count = arr.length / 2; // for(int i = 0;i<count;i++){ //交換兩個變量的值 int tmp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = tmp; } } }View Code
Java中參數傳遞的原則:
Java中所有的參數傳遞原則是:值傳遞
不論是基本數據類型還是引用數據類型,傳遞給形參的都是實參的副本!
基本數據類型的形參,在方法體內的更改,在方法外看不到.
應用數據類型的形參,在方法體內對應用內存地址中的元素的更改,在方法外可以看到.
(代碼中詳細介紹)
/* 參數傳遞的原則: 若參數是基本數據類型:傳遞是實參的一個副本. 方法體內對形參數據的更改,在方法外看不到 若參數是引用數據類型:傳遞是實參的一個副本. 方法體內對形參指向的對象的數據的更改,在方法外可以看到!!! */ public class PassArgsDemo{ public static void main(String[] args){ /* // int x = 10; int y = 20; clear(x,y); System.out.println(x +","+ y);//10,20 */ // int[] arr = {1,2,3}; // print(arr); //單獨調用 clear(arr); //查看數組的元素值 print(arr); } public static void print(int[] arr){ for(int i = 0;i<arr.length;i++){ System.out.print(arr[i] + " "); } System.out.println(); } //自定義方法,參數是基本數據類型 public static void clear(int a,int b){//形參上的a,b實際上只是接收了實參的值的副本!! System.out.println("clear方法被調用"); //把傳遞進來的參數設置為0 a = 0; b = 0; } //自定義方法,參數是引用數據類型 public static void clear(int[] arr){ //遍歷數組,都賦值為0 for(int i = 0;i<arr.length;i++){ arr[i] = 0; } } } 值傳遞: 不論是基本數據類型還是引用數據類型,傳遞給形參的都是實參的副本!! 只不過: 基本數據類型的形參,在方法體內的更改,在方法外不看到. 引用數據類型的形參,在方法體內的更改,在方法外可以看到. public static void test1(int a){ //這裏對形參a做的所有改變,都是對副本的改變,在方法外部是看不到的!!! } public static void test2(int[] arr){ //這裏對arr指向的內存空間的更改,在方法外可以看到, //因為兩個引用都指向的是同樣的內存空間 //但是對arr重新賦值,在方法外是看不到的. arr = null; //表示把形參引用的地址值改了,並不是把arr原來指向的內存地址的內容改了. //此時在方法外是看不到改變的. }View Code
二維數組:
元素本身是一維數組的一維數組.
初始化方式:
動態初始化:
int[][] arr = new int[3][];
int[][] arr = new int[3][2];
靜態初始化:
int[][] arr = new int[][]{{1},{2,3},{4,5,6}};
int[][] arr = {{7},{8,9},{10,11,12}};
二維數組的應用(查看代碼):
/* 二維數組:元素本身是一維數組的 一維數組. int[][] arr = new int[3][]; //定義一個有三個元素的二維數組,它的每個元素又是另一個一維數組 arr[0] = new int[2]; arr[1] = {1,2,3}; 二維數組的遍歷: 關鍵是第二維數組的長度的確定. 二維數組名[index].length */ public class Dem2Array{ public static void main(String[] args){ /* //定義一個二維數組,動態初始化,指定長度是3 int[][] arr = new int[3][]; //指定每個元素指向的一維數組是... arr[0] = new int[2]; arr[1] = new int[3]; //打印二維數組的各個元素值: System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //訪問二維數組中的元素 System.out.println(arr[0][0]);//0 //第二種格式:二維數組的每個元素指向的一維數組長度是一致的. int[][] arr2 = new int[2][4]; //第三種格式:靜態初始化,指定值,不指定長度! int[][] arr3 = new int[][]{{1},{2,3,4,5,6},{1,2}}; */ int[][] arr3 = new int[][]{{1},{2,3,4,5,6},{1,2}}; //遍歷二維數組 //外層循環控制的是二維數組的元素的遍歷 for(int i = 0;i<arr3.length;i++){ //內層循環控制的是最裏層的一維數組的元素的遍歷 for(int j = 0;j<arr3[i].length;j++){ System.out.print(arr3[i][j] + " "); } System.out.println(); } } }View Code
/* 獲取二維數組所有元素的個數: 計數器思想: 定義一個變量,初始值必須為0,滿足條件時,加1. */ public class GetCountDemo{ public static void main(String[] args){ int[][] arr = {{1},{2,3},{4,5,6},null}; arr[3] = new int[]{7,8,9};//在二維數組動態初始化時,一維數組的初始化,不能簡寫!!! // int count = 0; for(int i = 0;i<arr.length;i++){ for(int j = 0;j<arr[i].length;j++){ count++; } } // System.out.println("二維數組的元素個數是: " + count); } }View Code
/* 假設以下是某公司四個季度的銷售記錄,將數據保存在一個二維數組中,並統計全年的銷量之和 第一季度:10,20,30 第二季度:40,50,60 第三季度:70,80,90 第四季度:30,30,30 */ public class GetSum{ public static void main(String[] args){ int[][] arr = {{10,20,30},{40,50,60},{70,80,90},{30,30,30}}; int sum = 0; for(int i = 0;i<arr.length;i++){ for(int j = 0;j<arr[i].length;j++){ sum += arr[i][j]; } } System.out.println("全年的銷量之和是 :" + sum); } }View Code
/* 楊輝三角形: 1 11 121 1331 ... 規律: 每行的數字個數和行數相同! 行首和行尾都為1, 其它的數字:是它正上方的數字和緊鄰的前一個數字之和. */ public class YangHuiDemo{ public static void main(String[] args){ int[][] arr = new int[8][]; //給每個二維數租的元素賦值 for(int i = 0;i<arr.length;i++){ //創建一個新的數組 arr[i] = new int[i+1]; //循環新建的一維數組 for(int j = 0;j<arr[i].length;j++){ //對新建的一維數組賦值 if(i == 0 || j == 0 || j == i){ arr[i][j] = 1; }else{ arr[i][j] = arr[i-1][j] + arr[i-1][j-1]; } } } for(int i = 0;i<arr.length;i++){ for(int j = 0;j<arr[i].length;j++){ System.out.print(arr[i][j] + " "); } System.out.println(); } } }View Code
面向對象編程:
類和對象的關系:
定義一個Dog類: 成員變量: String color; int price; String name; int age; 成員方法: public void eat(){ } public void sleep(){ } 類是一個抽象的概念: 作用主要是用來創建對象!!! 創建對象的格式: 類名 對象名 = new 類名(); Dog d = new Dog(); */
定義類,使用類:
/* 定義一個Dog類: 成員變量: String color; int price; String name; int age; 成員方法: public void eat(){ } public void sleep(){ } 類是一個抽象的概念: 作用主要是用來創建對象!!! 創建對象的格式: 類名 對象名 = new 類名(); Dog d = new Dog(); */ public class Dog{//成員變量(屬性),如果定義時沒有賦值,成員變量都有默認值:null,0 String name; // null int age = 2; // 2 String color; // null //成員方法:和之前定義方法的格式一致,把static去掉!!! public void eat(){ System.out.println("eat"); } public void run(){ System.out.println("run"); } } /* //可以在自定義類中寫main方法測試,但是不好! public static void main(String[] args){ //使用之前定義Dog類創建對象: Dog d = new Dog(); //調用對象的方法 d.eat(); d.run(); //訪問對象的屬性 System.out.println(d.name); System.out.println(d.age); System.out.println(d.color); } */View Code
/* Dog類的測試類 */ public class DogDemo{ public static void main(String[] args){ Dog d = new Dog(); d.eat(); d.run(); System.out.println(d.name); System.out.println(d.age); System.out.println(d.color); } } /* 程序在編譯時,會自動檢測源文件中使用到的類,如果這個類是我們自定義的類,並且沒有經過編譯的話,那麽系統就會自動的把程序中使用到的類進行編譯.這樣在程序運行時,就不會出現找不到類的錯誤. */
創建對象:
訪問對象的變量:
調用對象的方法:
Java-數組-面向對象