楊老師課堂_Java教程第六篇之引用資料型別_類的運用

楊校發表於2018-01-03
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/kese7952/article/details/78962868

今天主要是講解以下知識點:
1、自定義型別的定義及使用
2、自定義類的記憶體圖
3、ArrayList集合的基本功能
4、王者榮耀隨機迎戰案例及庫存案例程式碼優化

01引用資料型別_類

* A: 資料型別
    * a: java中的資料型別分為:基本型別和引用型別
* B: 引用型別的分類
    * a: Java為我們提供好的類,比如說:Scanner,Random等。
    * b: 我們自己建立的類,按照類的定義標準,可以在類中包含多個方法與屬性,來供我們使用。 

02自定義類的概述

* A: 自定義類的概述
    * java程式碼對映成現實事物的過程就是定義類的過程。
    * 舉例:
        我們就拿一部手機進行分析,它能用來做什麼呢?它可以打電話,上網,聊微信,打遊戲等,這些就是手機所提供的功能,也就是方法(或者說是函式);手機也有它的特徵,如顏色、尺寸大小、品牌型號等,這些就是手機的特徵,也就是屬性
    * 目前,我們只關注類中的屬性,類中的方法在物件導向部分再進行學習。

03自定義類的格式

* A: 自定義類的格式
    * a: 使用類的形式,對現實中的事物進行描述。
    * b: 事物由方法和屬性兩部分組成。
        * 方法: 這個事物具備的功能。
        * 屬性: 這個事物具備的特徵。
    * c: 格式
        public class 類名{
            屬性定義
              修飾符 資料型別 變數名 = 值

            方法定義
              修飾符 返回值型別  方法名(引數列表){

              }
        }

04自定義的手機類

* A: 自定義的手機類
    * a: 案例程式碼
        public class Phone{
            /*
                定義手機的屬性
            */
            String color ;
            String brand ;
            double size ; 
        }

05測試手機類

* A: 呼叫方法執行流程
    * a: 實現引用型別的步驟
        * 1: 匯入包 , 類都是在同一個資料夾,不需要匯入包
        * 2: 建立引用型別的變數
        * 3: 變數.型別中的功能
    * b: 案例程式碼
        public class TestPhone{
            public static void main(String[] args){
                // 2: 建立引用型別的變數
                Phone p = new Phone();
                //System.out.println(p);  //輸出記憶體的地址

                //3: 變數.型別中的功能
                //變數 p.的方式,呼叫類中的屬性
                //屬性就是變數 , 賦值和獲取值
                p.color = "曜石黑";
                p.brand = "華為P10";
                p.size = 5.2;

                //獲取屬性值
                System.out.println(p.color+"  "+p.brand+"  "+p.size);
            }
        }

06自定義類的記憶體圖_1

* A: 自定義類的記憶體圖_1
    * a: ![記憶體分佈圖](http://java.javabs.cn/csdn/2.jpg)

07自定義類的記憶體圖_2

* A: 自定義類的記憶體圖_1
    * a: ![記憶體分佈圖](http://java.javabs.cn/csdn/2.jpg)

08兩個引用型別變數記憶體圖

* A: 自定義類的記憶體圖_1
    * a:  a: ![引用型別變數記憶體圖](http://java.javabs.cn/csdn/3.jpg)

09自定義類的練習

* A: 實體類的程式碼
    /*
        印表機,包含屬性(品牌、容量大小、顏色等)
        定義類,描述事物,印表機
          屬性: 品牌,大小 ,顏色

        定義類,類名字,Printer
        類的範圍,定義三個屬性
    */
    public class Printer{
        //定義三個屬性
        String brand ;
        double size ;
        String color ;
    }

    /*
       汽車,包含屬性(品牌、排量、型別等)
       定義類,類名 Car
         屬性 品牌 排量 型別
     */
    public class Car{
        //定義汽車三個屬性
        String brand ;
        double licheng ;
        String type;
    }

     /*
       學生,包含屬性(姓名,年齡,性別等)
       定義類,類名Student
         三個屬性: 姓名,年齡,性別 (char)
    */
    public class Student{
        String name;
        int age ;
        char sex ;
    }

    /*
       遊戲,包含屬性(姓名,職業,裝備等)
       定義類,類名KingGlory
         三個屬性: 姓名,職業,裝備 (String)
    */
    public class KingGlory{
        String name;
        String job ;
        String equipment ;
    }
* B: 測試類的程式碼
    /*
       定義的測試類
       同時測試,印表機,汽車,學生,遊戲
    */
    public class Test{
        public static void main(String[] args){
            //建立印表機引用型別
            Printer printer = new Printer();

            printer.brand = "惠普HP";
            printer.color = "白色";
            printer.size = 25;

            System.out.println(printer.brand+"  "+printer.color+"  "+printer.size);

            //建立汽車引用型別
            Car c = new Car();
            c.brand = "特斯拉";
            c.type = "新能源汽車";
            c.licheng = 525;

            System.out.println(c.brand+"  "+c.type+"  "+c.licheng);

            //建立學生引用型別
            Student stu = new Student();
            stu.name = "多隆";
            stu.age = 20;
            stu.sex = `男`;
            System.out.println(stu.name+"  "+stu.age+"  "+stu.sex);

            //建立遊戲引用型別
            KingGlory kg = new KingGlory();
            kg.name = "趙雲";
            kg.job = 戰士;
            kg.equipment = `抵抗之靴+黑色戰斧+泣血之刃+破軍+振興之鎧+暴烈之甲`;
            System.out.println(kg.name+"  "+kg.job+"  "+kg.equipment);

        }
    }

10ArrayList建立變數的步驟

* A: ArrayList建立變數的步驟
    * a: 匯入包 java.util包中
    * b: 建立引用型別的變數
        資料型別< 集合儲存的資料型別>  變數名 = new 資料型別<集合儲存的資料型別>();
        集合儲存的資料型別: 要將資料儲存到集合的容器中
        建立集合引用變數的時候,必須要指定好,儲存的型別是什麼
    * c: 變數名.方法 
        注意: 集合儲存的資料,8個基本型別對應8個引用型別
        儲存引用型別,不儲存基本型別

11ArrayList建立變數舉例

* A: ArrayList建立變數的示例程式碼
    import java.util.ArrayList;
    public class ArrayListDemo{
        public static void main(String[] args){
            //建立集合容器,指定儲存的資料型別
            //儲存字串
            ArrayList<String> array = new ArrayList<String>();

            //建立集合容器,儲存整數
            ArrayList<Integer> array2 = new ArrayList<Integer>();

            //建立集合容器,儲存手機型別
            ArrayList<Phone> array3 = new ArrayList<Phone>();
        }
    }

12ArrayList的常見方法

* A: ArrayList的常見方法
    * a: add(引數) 向集合中新增元素
    * b: get(int index) 取出集合中的元素,get方法的引數,寫入索引
    * c: size() 返回集合的長度, 集合儲存元素的個數
* B: 案例程式碼
    import java.util.ArrayList;
    public class ArrayListDemo_1{
        public static void main(String[] args){
            //定義集合,儲存字串元素
            ArrayList<String> array = new ArrayList<String>();
            //呼叫集合方法add儲存元素
            array.add("We");
            array.add("love");
            array.add("to");
            array.add("learn");
            array.add("java");
            //輸出集合的長度,呼叫集合方法size, size方法的返回值型別 int
            int size = array.size();
            System.out.println(size);

            //獲取出集合中的一個元素,獲取1索引的元素
            //集合的方法get, 獲取元素後結果資料型別
            String s = array.get(1);
            System.out.println(s);


            System.out.println(array.get(0));
            System.out.println(array.get(1));
            System.out.println(array.get(2));
            System.out.println(array.get(3));
        }
    }

13ArrayList集合的遍歷

* A: 案例程式碼
    /*
       集合的遍歷
       實現思想也是索引思想
       集合的索引從0開始,到 size()-1
       方法get(int index)
    */
    import java.util.ArrayList;
    public class ArrayListDemo_2{
        public static void main(String[] args){
            ArrayList<Integer> array = new ArrayList<Integer>();
            array.add(111);
            array.add(125);
            array.add(123);
            array.add(120);
            array.add(128);

            //對集合進行遍歷
            //使用方法 size+get組合進行遍歷
            for(int i = 0 ; i < array.size(); i++){
                System.out.println( array.get(i) );
            }
        }
    }

14ArrayList補充方法

* A: ArrayList補充方法
    * a: add(int 索引,儲存的元素)  將元素新增到指定的索引上
    * b: set(int 索引,修改後的元素)     將指定索引的元素,進行修改
    * c: remove(int 索引)             刪除指定索引上的元素
    * d: clear()                    清空集合中的所有元素
* B: 案例程式碼
    import java.util.ArrayList;
    public class ArrayListDemo_3{
        public static void main(String[] args){

            ArrayList<Integer> array = new ArrayList<Integer>();
            array.add(1);
            array.add(2);
            array.add(3);
            array.add(4);

            //在索引2上,新增元素7
            array.add(2,7);

            //將0索引上的元素,修改成10
            array.set(0,10);

            //將4索引上的元素,刪除
            array.remove(4);

            array.clear();

            //使用方法 size+get組合進行遍歷
            for(int i = 0 ; i < array.size(); i++){
                System.out.println( array.get(i) );
            }
        }
    }

15王者榮耀隨機迎戰案例分析

* A: 王者榮耀隨機迎戰案例分析
    王者榮耀娛樂模式中的火焰山大戰會隨機的給出英雄進行遊戲,列印這名英雄的資訊。
    我們對本案例進行分析,得出如下分析結果:
        1.儲存全部英雄資訊(姓名、職業)
            將容器換成集合,集合中存的是Hero型別
        2.列印全部英雄每一個人的資訊(姓名、職業)
             遍歷集合
        3.在英雄總人數範圍內,隨機產生一個隨機數,查詢該隨機數所對應的英雄資訊(姓名、職業)
        王者榮耀隨機迎戰明確地分為了三個功能。如果將多個獨立功能的程式碼寫到一起,則程式碼相對冗長,我們可以針對不同的功能可以將其封裝到一個方法中,將完整獨立的功能分離出來。
        而在儲存英雄姓名時,如果對每一個英雄都定義一個變數進行姓名儲存,則會出現過多孤立的變數,很難一次性將全部資料持有。此時,我們採用ArrayList集合來解決多個英雄資訊的儲存問題

16王者榮耀隨機迎戰程式碼實現

* A: 王者榮耀隨機迎戰案例程式碼
    /*
       王者榮耀隨機迎戰,集合改進 (的姓名英雄和職業)
       遊戲中有英雄這個事物,使用定義類的形式,描述英雄事物
       屬性: 姓名,職業

       姓名儲存了陣列, 將容器換成是集合
       String[] h = {"",""};
       集合中,儲存的是英雄的姓名嗎?  應該儲存Hero型別

       儲存英雄:
          英雄型別,儲存到集合中
       總覽: 遍歷集合
       隨機: 隨機數,作為索引,到集合中找到元素
       三個功能,共享的資料,集合容器,
       定義三個方法,必須引數傳遞集合
    */
    import java.util.ArrayList;
    import java.util.Random;
    public class RandomAgainst{
        public static void main(String[] args){
            //定義集合,儲存的是HeroName型別變數
            ArrayList <HeroName> array = new ArrayList<HeroName>();
            //呼叫新增方法
            add (array);
            //呼叫遍歷集合
            printArrayList(array);

            randomHeroName(array);
        }
        /*
          隨機數,當作集合的索引,到集合中找到元素
        */
        public static void randomHeroName(ArrayList<HeroName> array ){
            Random r = new Random();
            int number = r.nextInt( array.size());
            //隨機數,索引,到集合中get
            HeroName h = array.get(number);
            System.out.println( h.name +"  "+h.job);
        }

        /*
            總覽英雄的資訊,遍歷集合
        */
        public static void printArrayList(ArrayList<HeroName> array){
            for(int i = 0 ; i < array.size();i++){
                //儲存集合的時候, 集合.add(hn1)  hn1 是HeroName型別變數
                //獲取的時候,集合.get方法,獲取出來的是什麼, 還是HeroName型別變數
                HeroName h = array.get(i);
                System.out.println(h.name+"  "+h.job);
            }
        }

        /*
           定義方法,實現儲存英雄的姓名和年齡
           建立HeroName型別變數,儲存到集合中
        */
        public static void add (ArrayList<HeroName> array){
            //建立HeroName型別變數
            HeroName hn1 = new HeroName();
            HeroName hn2 = new HeroName();
            HeroName hn3 = new HeroName();
            HeroName hn4 = new HeroName();
            HeroName hn5 = new HeroName();

            hn1.name = "趙雲";
            hn1.job =  "戰士";

            hn2.name = "后羿";
            hn2.job =  "射手";

            hn3.name = "甄姬";
            hn3.job =  "法師";

            hn4.name = "張飛";
            hn4.job =  "輔助";

            hn5.name = "劉禪";
            hn5.job =  "坦克";

            //將HeroName變數,儲存到集合中
            array.add(hn1);
            array.add(hn2);
            array.add(hn3);
            array.add(hn4);
            array.add(hn5);
        }
    }

17庫存案例分析加入集合

* A: 庫存案例分析加入集合
    * a:![記憶體分佈圖](http://java.javabs.cn/csdn/2.jpg)

18庫存案例新增商品資訊

* A: 案例程式碼
    /*
       定義,.描述商品的類
       商品 4個屬性
         商品名字  大小     價格    庫存
          String    double   double  int

        定義類,類名Goods
        這個型別的變數,儲存到集合中
    */
    public class Goods{
        //定義商品名字
        String brand ;
        //大小屬性
        double size ;
        // 價格屬性
        double price ;
        //庫存屬性
        int count ;
    }

    /*
        實現庫存管理案例:
          1.儲存商品資訊
            儲存商品型別變數
            將商品型別的變數,儲存到集合中
    */
    //import java.util.ArrayList;
    import java.util.*;
    public class Shopp{
        public static void main(String[] args){
            //建立ArrayList集合,儲存Goods型別
            ArrayList<Goods> array = new ArrayList<Goods>();
            //呼叫新增商品資訊的方法
            addGoods(array);
        }

        /*
           定義方法,將商品的資訊儲存到集合中
           集合是所有方法的共享資料,引數傳遞
        */
        public static void addGoods (ArrayList<Goods> array){
            //建立商品型別變數 Goods型別的變數
            Goods g1 = new Goods();
            Goods g2 = new Goods();
            g1.brand = "HuaWei";
            g1.size = 5.8;
            g1.price = 2999.99;
            g1.count = 3;

            g2.brand = "IPhone X";
            g2.size = 5.8;
            g2.price = 8999.99;
            g2.count = 1;

            //Goods型別的變數,儲存到集合中
            array.add(g1);
            array.add(g2);
        }
    }

19庫存案例檢視庫存清單

* A: 案例程式碼
    /*
        實現庫存管理案例:
          1.儲存商品資訊
            儲存商品型別變數
            將商品型別的變數,儲存到集合中

          2.檢視庫存清單
            將集合進行遍歷, 獲取出集合中儲存的Goods型別變數
            輸出每一個Goods型別的屬性
            計算求和: 總庫存,總金額
    */
    //import java.util.ArrayList;
    import java.util.*;
    public class Shopp{
        public static void main(String[] args){
            //建立ArrayList集合,儲存Goods型別
            ArrayList<Goods> array = new ArrayList<Goods>();
            //呼叫新增商品資訊的方法
            addGoods(array);
        }

        /*
           定義方法,檢視庫存清單,遍歷集合
        */
        public static void printStore(ArrayList<Goods> array){
            //輸出表頭
            System.out.println("----------商場庫存清單----------");
            System.out.println("品牌型號     尺寸    價格    庫存數");
            //定義變數,儲存總庫存數,和總金額
            int totalCount = 0 ;
            double totalMoney = 0;
            //遍歷集合
            for(int i = 0 ; i < array.size(); i++){
                //get(索引)獲取出集合中的元素,儲存的是Goods類,獲取的也是Goods型別
                //使用Goods型別變數,接受get方法結果
                Goods g = array.get(i);
                System.out.println(g.brand+"   "+g.size+"    "+g.price+"    "+g.count);
                totalCount = totalCount+g.count;
                totalMoney = totalMoney + g.count*g.price;
            }
            System.out.println("總庫存數: "+totalCount);
            System.out.println("商品庫存總金額: "+totalMoney);
        }

        /*
           定義方法,將商品的資訊儲存到集合中
           集合是所有方法的共享資料,引數傳遞
        */
        public static void addGoods (ArrayList<Goods> array){
            //建立商品型別變數 Goods型別的變數
            Goods g1 = new Goods();
            Goods g2 = new Goods();
            g1.brand = "HuaWei";
            g1.size = 5.8;
            g1.price = 2999.99;
            g1.count = 3;

            g2.brand = "IPhone X";
            g2.size = 5.8;
            g2.price = 8999.99;
            g2.count = 1;

            //Goods型別的變數,儲存到集合中
            array.add(g1);
            array.add(g2);
        }
    }

20庫存案例修改庫存清單及測試程式碼的實現

* A: 案例程式碼
    /*
        實現庫存管理案例:
          1.儲存商品資訊
            儲存商品型別變數
            將商品型別的變數,儲存到集合中

          2.檢視庫存清單
            將集合進行遍歷, 獲取出集合中儲存的Goods型別變數
            輸出每一個Goods型別的屬性
            計算求和: 總庫存,總金額

         3.修改商品的庫存
            集合遍歷 ,獲取出集合中儲存的Goods型別變數
            變數呼叫Goods類的屬性count,值進行修改 (鍵盤輸入)
    */
    //import java.util.ArrayList;
    import java.util.*;
    public class Shopp{
        public static void main(String[] args){
            //建立ArrayList集合,儲存Goods型別
            ArrayList<Goods> array = new ArrayList<Goods>();
            //呼叫新增商品資訊的方法
            addGoods(array);
            //進入死迴圈中
            while(true){
                //呼叫選擇功能的方法,獲取到使用者輸入的功能序號
                int number = chooseFunction();
                //對序號判斷,如果=1 進入檢視庫存功能  = 2 進入修改庫存功能  =3 結束
                switch(number){
                    case 1:
                    //進入檢視庫存,呼叫檢視庫存的方法,傳遞儲存商品資訊的集合
                    printStore(array);
                    break;

                    case 2:
                    //進入修改庫存功能,呼叫修改庫存的方法,傳遞集合
                    update(array);
                    break;

                    case 3:
                    return ;

                    default:
                     System.out.println("無此功能");
                     break;
                }
            }
        }
        /*
          方法定義,修改庫存
          鍵盤的輸入,將Goods中的屬性值,修改
        */
        public static void update(ArrayList<Goods> array){
            Scanner sc = new Scanner(System.in);
            //遍歷集合,獲取集合中的每個元素
            for(int i = 0 ;  i < array.size(); i++){
                //集合方法get獲取的是集合的元素,元素型別Goods
                Goods g = array.get(i);
                System.out.println("請輸入"+g.brand+"的庫存數");
                //Goods屬性,count進行修改
                g.count = sc.nextInt();
            }
        }
        /*
           定義方法,實現選擇選單,使用者根據功能選擇選單
        */
        public static int chooseFunction(){
            System.out.println("-------------庫存管理------------");
            System.out.println("1.檢視庫存清單");
            System.out.println("2.修改商品庫存數量");
            System.out.println("3.退出");
            System.out.println("請輸入要執行的操作序號:");
            Scanner sc = new Scanner(System.in);
            int number = sc.nextInt();
            return number;
        }

        /*
           定義方法,檢視庫存清單,遍歷集合
        */
        public static void printStore(ArrayList<Goods> array){
            //輸出表頭
            System.out.println("----------商場庫存清單----------");
            System.out.println("品牌型號     尺寸    價格    庫存數");
            //定義變數,儲存總庫存數,和總金額
            int totalCount = 0 ;
            double totalMoney = 0;
            //遍歷集合
            for(int i = 0 ; i < array.size(); i++){
                //get(索引)獲取出集合中的元素,儲存的是Goods類,獲取的也是Goods型別
                //使用Goods型別變數,接受get方法結果
                Goods g = array.get(i);
                System.out.println(g.brand+"   "+g.size+"    "+g.price+"    "+g.count);
                totalCount = totalCount+g.count;
                totalMoney = totalMoney + g.count*g.price;
            }
            System.out.println("總庫存數: "+totalCount);
            System.out.println("商品庫存總金額: "+totalMoney);
        }

        /*
           定義方法,將商品的資訊儲存到集合中
           集合是所有方法的共享資料,引數傳遞
        */
        public static void addGoods (ArrayList<Goods> array){
            //建立商品型別變數 Goods型別的變數
            Goods g1 = new Goods();
            Goods g2 = new Goods();
            g1.brand = "HuaWei";
            g1.size = 5.8;
            g1.price = 2999.99;
            g1.count = 3;

            g2.brand = ""IPhone X
            g2.size = 5.8;
            g2.price = 8999.99;
            g2.count = 1;

            //Goods型別的變數,儲存到集合中
            array.add(g1);
            array.add(g2);
        }
    }

分割線
作者: 楊校

出處: http://blog.csdn.net/kese7952

分享是快樂的,也見證了個人成長曆程,文章大多都是工作經驗總結以及平時學習積累,基於自身認知不足之處在所難免,也請大家指正,共同進步。

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出, 如有問題, 可郵件(397583050@qq.com)諮詢。


相關文章