1. 程式人生 > >Java-數組-面向對象

Java-數組-面向對象

測試類 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 class
CopyArrayDemo{ 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(); } }
View Code

數組的合並:

分析:

創建新數組,長度是兩個駐足的長度之和

遍歷第一個數組,依次賦值給目標數組

遍歷第二個數組,依次賦值給目標數組(代碼查看)

技術分享圖片
/*
合並兩個數組
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-數組-面向對象