javase_09(面向對象總結)

Java的環境配置 day01
 
 1.    環境配置有如下的三種方法:
 a)    我的電腦屬性: 從path 環境中配置
 b)    利用臨時的變量設置: set path = java的所在路徑\bin%d%
 c)    定義批處理文件  : 設置步驟如下:
 a)    set path = %cd%\H:\java\jdk1.7\bin
 b)    
 c)    start
 
 一.    java的環境搭配
 1.    安裝jdk >1.jdk是java的開發和運行環境 >2.jre是java的運行環境
 2.    配置環境變量?爲什麼呢?方便在任意的目錄下使用java工具
 a.    我的電腦—屬性—高級—環境變量
 在已有的環境變量path的基礎下,添加一個jdk\bin目錄即可.
 這種方法較爲一勞永逸
 技巧:爲了日後修改方便,不需要總是修改path,可以首先定義一個環境變量 JAVA_HOME 把前面的路徑保存下來.並且通過%JAVA_HOME%來動態的獲取該變量
 b.    也可以通過臨時環境變量,通過dos控制檯,使用set命令即可。
 set path = (java的按照目錄)jdk\bin;&path&;
 
 c.    如果是在別人的電腦去完成java開發,還不想配置java環境變量.咱們可以使用批處理來完成:
 a)    假設: a.bat 
 b)    set path = %cd%jdk\bin;%path%  %cd%代表獲取當前目錄.
 c)    爲了避免了不讓它一閃而過:start.
 
 二:轉義字符
     1.\n:換行
     2.\t:tab鍵
     3.\b:退格鍵    
 
 
 三: 數據運算符
 
 & : 只有兩邊都爲true結果爲true,否則爲false。
 |:只有兩邊爲flase才爲false,否則都爲true
         ^ : 只有兩邊相同 結果爲false,否則爲true。
 
         
 
 Java基礎知識 day02
 
 二.變量:
         在內存中所開闢的空間將常量值進行存儲、方便運算。
         好處:該空間可以重複使用..
         定義格式:
                     數據類型    變量名    = 初始值
         使用變量的注意事項:
 1.    變量有自己的作用域
 2.    變量不能賦空值.
 
 基本數據類型:
 byte int long char short double boolean float
 引用數據類型:
 接口    類    數組
     
         什麼時候需要定義變量:
         當數據不確定時,或者運算後的結果需要進行下一步的操作
         這時候就要定義一個變量將該不確定的數據進行存儲。
 
 三.運算符:
 1.    算術運算符:
 1.    +:連接符
 2.    %取餘: 任何數%2 結構非零急一
 3.    ++自增 (++a先運算後賦值 a++先賦值後運算)
 2.    賦值運算符:
 1.    int a,b;
 2.    a=b=c = 4;
 3.    i+=4; i=i+4;
 
 3.比較運算符:
         特點:運算後結構非false 或true
                 ==    相等於
 
 4.邏輯運算符
 & | ^ 這些運算符不僅僅可以代表boolean表達式,也可以進行位運算。
 &和&&:當左邊爲false時,&:兩邊的表達式都參與運算。&&右邊的表達式不參與運算。
 |和||:當左邊爲true時,|:兩邊的表達式都參與運算。||右邊的表達式不參與運算。
 ^:兩邊一樣結果爲false。
 
 5.位運算符
     左移:<<  3<<2=12  3<<4 = 48
     右移:>> 和 >>> 區別: 
 >>:右移後,空位按照移位前的最高位來填充。最高位爲0,用0補。最高位爲1用1來補    
 >>>:無符號右移,無論最高位是什麼,都用0補。
     
 6.負數的由來:取反+1
 -6:         00000000    00000000    00000000    00000110
 取反:    11111111    11111111    11111111    11111001
 加一:    11111111    11111111    11111111    11111010
                                                     
 
 四.語句
 
     判斷:if
 1.    if(條件表達式){}
 2.    if(條件表達式){}else{};
 3.    if(條件表達式){}else{}
 
 對於第二種格式:簡化形式,三元運算符
         變量 =(條件表達式)? 表達式1 :表達式2
 簡化形式與非簡化形式有如果不同:
 解答: 簡化形式因爲是一個運算,所以咱們必須要有一個結果。
 
 if(x >1)
     Y = 100;
 else
     Y = 200;
 Y =(x>1)? 100: 200;
 注意:無論條件表達式有多複雜,只要有true    ||flase 出現,則沒問題.否則條件表達式會出錯:if(x =1);
         
         選擇:switch(表達式)
                 
                 switch(表達式)
                 {
                     case 1:
                         執行語句;
                         break;
                     case    2:
                         執行語句;
                         break;
                     case    3:
                         執行語句;
                         break;
                     default;
                         執行語句;
 }
 
                 特點:
 1.表達式運算四種類型的值:byet     int short char(它有一個自動型轉換過程)
 2.case和default之間是可以沒有任何的順序,但是在運算期間,肯定會先讀取第一個case    ,當case不匹配,會繼續執行其他的case。當所有的case不匹配的時候.會運行default。
 3.switch語句結束的兩個方式:a.讀取switch語句大括號結束b.碰到break語句結束.注意:如果沒有碰到break,也沒有讀取結束的時候,那麼程序是一直往下面運行,直到程序運算完畢
 
         
 
             循環:while    du{}while; for
             
 1.    while(表達式){執行語句}(先判斷後執行)
 2.    do{執行語句}while(條件表達式);(先執行一次,再判斷)
 3.    for(初始化表達式;循環判斷條件;循環後的操作表達式){}
 
 什麼時候用這些語句呢?
     當對固定的幾個值進行判斷的時候,建議使用switch
     當對範圍的判斷,或者對運算後的真假進行判斷的時候,我們需要用到if
     
     當需要執行語句多次的時候.我們使用到循環
     while與for循環是可以相互交換
     因爲作用域的關係:
 在使用兩個語句的時候有些區分,如果定義變量只爲循環存在,循環結束後就沒有意義。我們使用到for循環語句。
                 如果變量在循環後再執行別的運算,那麼我們使用while比較好~
 
                 break:選擇結構和循環結構
                 continue:循環結果:結束本次循環.繼續下一次循環
 
         函數:
                 特點:
                         --類中的一個獨立小程序
                         --只有被調用的時候纔會運算
                         --可以重複的去運行
                 好處:
                         對代碼進行封裝,可以提高代碼的複用性
                 格式:
                         返回值類型    函數名(參數類型    形式參數1)
 {
         執行語句;
         return 返回值;
 }
                 
 如果定義一個函數?
 1.    明確該功能函數運算後的結果。(明確返回值類型)
 2.    明確該功能實現的過程,是否需要有未知值參與運算(明確函數的參數類型)
 要定義一個加法運算功能
 
 int getSum(int x ,int y)
 {
     return x + y;
 }
 
 方法的重載:@overload(標記重載)
 特點:當多個函數的功能一致,只是參與運算不同的時候,爲了提高代碼的可閱讀性,我們可以使用方法的重載.用參數來進行區分.    
 int getSum(int x,int y,int z)
 {
     return x + y + z;
 }
 
         函數的特點:
 有一種情況,函數執行一個功能,但沒有具體的返回值。返回值類型不可以具體的來確定的時候,那麼我們用void關鍵字來表示.那麼函數的return 語句是可以忽略不寫的.  也可以:return ;
 
 
 day03  數組
 
 五.數組: 其實就是同類型的一組數字
 
     同一種類型數據的集合,類型一定要一致。
 
     內存圖:
             java劃分了兩片內存,方便了運算
 
             棧內存:存放局部變量,函數上和函數定義的變量都是局部變量
             變量一點使用完畢,自動清空。
             棧內存: new關鍵字所建立的,都稱爲實例.在堆內存裏面存放的.
 
 
     數組常見的如下問題:
         角標越界異常:使用到數組中不存在的角標。
 (ArrayIndexOutOfBoundsException)   數組特有異常
 
 空指針異常:引用型變量等於null,也就是沒有指向。
 (NullPointsException)
     ########
         本身就是一個容器,用來存儲數據.
         特點:固定的長度.        
         好處:給元素進行編號,從零開始。同時也可以length屬性獲取數組的長度.
     
         什麼時候使用數組?
         當數據較多的時候,通常是爲了方便操作這些數據都需要進行臨時存儲.
         
         習慣:
                 通常操作數組都需要遍歷,獲取數組中的元素需要一個指針。
                 通常對指針的值的改變也就是更改了數組裏邊的值啦~~
 
 
 
 選擇排序:
         int[]arr = {1,2,45,657,33,214,64,16,32,13};
 
         for(int i = 0;i<arr.length;i++)
         {
             for(int j = i+1;j<arr.length;j++)
             {
                 if(arr[j]>arr[i])
                 {
                     swap(arr,j,i);
                 }
             }
         }
 
 冒泡排序: bubbleSort
 
     public static int[] bubbleSort(int[]arr)
     {
             for(int i = 0;i<arr.length;i++)
             {
                     for(int j = 0;j<arr.length-i-1;j++)
                     {
                             if(arr[j]>arr[j+1])
                             {
                                     swap(arr,j,j+1);
                             }
                     }
             }
             return arr;
 
 
 day 04 面向對象
 面向對象:
 1.    符合現實中人民思考習慣的一種思想.
 2.    它將程序員的角色(執行者)轉換成(指揮者)
 3.    將複雜的問題簡單化.
 
 對象無處不在,一切皆對象
 
 對象是實實在在存在的個體,那麼我們需要使用計算機語言來進行描述
 在java當中,描述事物是通過類來完成,在計算機中是通過new 類來創建對象.並且指揮對象完成事情.
 
 例如: 製造汽車,通過汽車來描述:圖紙。對應的java中的類class
         通過圖紙來產生汽車: 對象,對應的就是java在堆內存中所產生的實例
 
 通過java語言編寫程序,其實就是不斷的定義類,創建對象的一個過程。
 成員變量(事物的屬性) 成員方法(事物的行爲)。    
 
 對象的存在有什麼好處?或者說怎麼才叫做對象?
 對象可以用於封裝數據.可以在對象中定義屬性和行爲,並指揮.
 
 在編寫程序中,當要完成某個功能的時候,先看一下java是否提供了自有的對象.如果有,那麼可以直接的去使用這個對象裏面的功能.否則如果該對象不存在.那麼我們需要定義一個對象,並將需要的功能封裝到該對象中,以便對象的重複使用.。
 
 對象是如何使用呢?
 通過new 關鍵字來建立,並且通過 對象.成員變量 的形式操作對象所做的事情..
 
 
 匿名對象:
             其實就是一個沒有名字的對象,可以理解爲創建對象的簡化形式.
             
 1.    當只對對象方法進行一次操作的時候可以使用
 a)    new  person();  
 2.    可以做爲實際參數的傳遞:
 a)    public void show(new Person());
 
 
 封裝:
     什麼是封裝呢?
             其實就是隱藏實現細節,提供了安全性
             
     在通過類來創建對象的時候,可以通過對象調用成員,也可以使用對象的屬性
     爲了提高安全性,所以避免了直接對屬性進行訪問:我們可以把它設計爲私有private
 
     對外提供方法來間接訪問age進行賦值!
         
         private int age ; 
         public void setAge(int age)
 {
     this.age = age;
 }
 
 public int  getAge()
 {
     retrun age;
 }
     在代碼的體現:
             1.函數就是一個最小的封裝體
             2.類本身就是一種封裝
             3.包也是一種封裝
             4.ssh框架也是一種封裝.
             5.timcat服務器軟件
 
 
 /*
 
         體現良好的封裝!
 */
 
 class Person
 {
     private String name ;
     private int age;
     
 
     /*
             這是隱藏下來的代碼~~
     */
     Person()
     {
         super();
     }
     public void setName(String name)
     {
         this.name = name;
     }
     public String getName()
     {
         return name ; //this.name
     }
 
     public void setAge(int age)
     {
         this.age = age;
     }
     public int getAge()
     {
         return age;
     }
 }
 class Demo5 
 {
     public static void main(String[] args) 
     {
         Person p = new Person();
         p.setName("kudy");
         String name = p.getName();
 
         p.setAge(18);
         int age = p.getAge();
     }
 }
 
 
 執行的過程:
 1.    加載Person .class文件到堆內存中
 2.    因爲new,在堆內存中開闢空間,創建對象。在對象中出現了name 與age
 3.    對象中的屬性默認初始化
 4.    對象中的屬性顯式初始化
 5.    構造函數初始化
 6.    創建引用變量,並將該對象的首地址給變量,該變量這時候就指向了對象。
 
 
 this語句代碼什麼?
                 1.this所在的函數所屬對象的引用
                 2.this被那個對象調用.那this就代表那個對象
 
     A)this還可以用與區分成員變量與局部變量同名的情況
 
     B)什麼時候使用this?
     當定義功能時,該變量內部使用了本類的對象,同時,this表示該對象
     
     C)this語句:
 在構造函數中,方便於構造函數調用,但注意:this語句只能在構造函數的第一位.因爲要對執行的數據進行初始化.
 
 
 
 day05 面向對象
 1,    構造函數
 a.    函數名與類名相同
 b.    沒有返回值
 c.    函數中沒有return語句
 
 作用: 可以對對象進行初始化
 
 比喻:Person p = new Person();
         a,加載Person.class文件到堆內存中
         b,在堆內存中開闢空間,創建實例對象
 c,對對象的內容進行默認的初始化
             d,對對象的內容進行顯式的初始化
             e,對對象自定義的內容進行初始化,通過構造函數來完成的.
             f,在棧內存中定義變量存入對象的地址值,指向該對象
 
     注意:
             在用class文件時,jvm會自動的在該類添加一個默認的構造函數(沒有構造函數,你就創建不了對象的哦)該函數的形參是空的.
             構造函數可以通過this來進行互相的調用,是通過this語句來完成
             this的語句一定要放在構造函數的第一行
 
 
 2,static關鍵字
         特點:
             ---隨着類的加載而加載,隨着類的消失而消失,靜態成員的聲明週期最長
             ---優先於對象
             ---被所有的對象所共享
             ---可以直接通過類名來調用
     
         注意:
             ---靜態方法只能訪問靜態的成員(因爲我是不需要創建對象就可以使用的)
             ---靜態方法中不能出現this,super關鍵字.因爲靜態方法沒有所謂的對象
             ---主函數是靜態的
 
         
 2,    設計模式:解決某類問題之間有效的方法.
 java中有23種設計模式
 
 單例設計模式:
 a)    私有化構造函數
 b)    定義一個靜態私有化的本類對象
 c)    定義一個靜態方法返回內部對象的地址
 
 
 
 
 class Singleton
 {
     private Singleton()
     {
         //私有化構造函數,避免創建對象!
     }
 
 
     private static Singleton singleton = new Singleton();
     public static Singleton getSingLeton()
     {
         return singleton;
     }
 }
 class Demo7 
 {
     public static void main(String[] args) 
     {
         Singleton s1 = Singleton.getSingLeton();
         Singleton s2 = Singleton.getSingLeton();
         System.out.println(s1== s2);
     }
 }
 
 3,靜態的代碼塊:
             特點:隨着類的加載而加載,執行一次,優先於函數
             作用:對於類的初始化
 
 
 4,內部類:
             其實就是一個類的內部中定義另外一個類,內部類可以定義在外部類裏面
             內部類可以直接訪問外部類的成員,那是因爲內部類只有一個外部類的引用(類名.this)而外部類訪問內部類的成員需要創建對象
 
     什麼時候使用內部類?
                     描述事物時,該事物內部與還有事物,那麼可以通過內部類來完成
 
     當內部類在成員位置上,可以被成員修飾符所修飾。    
     當內部類中定義了靜態成員時,內部類是必須要靜態的.但是靜態內部類侷限性
     但方法中裏面定義了內部類,方法裏面的屬性內部類是不能所訪問的.因爲局部變量是存儲在棧內存中,系統會不知道什麼時候會被釋放.那麼我們如果定義成final 就是沒問題.定義成final就是常量.是不能改變的量.是存儲在堆內存中.
 
     
 day06面向對象(面向對象的總結)
 
 異常:
 
     異常的處理機制:
 
     1.可以在方法後面使用throws關鍵字,聲明向外拋出一個異常
     2.可以使用try catch語句塊捕獲異常
         3.finally語句塊的作用: finally需要結合try使用.不論如何finally當中的代碼都是會被執行
     4.如果是運行時異常,那麼jvm是自動的拋出一個異常對象.讓虛擬機去處理.也可以自己手動的去處理.
 
     自定義異常:
 
     1.自定義編譯時異常,定義一個類繼承與Exception
 2.可以在程序中使用throw關鍵字向外拋出一個編譯時異常對象,這時方法必須向外拋出一個異常
             throw關鍵字相當於return 
     
     異常的使用細節:
 因爲都是爲了多態而服務的,所以當父類型的引用指向子類型的對象的時候/jvm就分辨不清楚啦~~)
 
 1.    子類重寫父類的方法.不能拋出被父類更多的方法.沒拋,子類不能拋.父類拋了.子類可以不拋.要拋也只能拋父類一樣的異常,或者父類異常的子類.
 2.    一個try語句可以跟多個catch語句一起來捕獲異常
     3.try finally 可以嵌套使用.
     
     異常的使用總結:
 
     1.異常是在程序運算期間發生的錯誤,所有的異常類都是Throwable的子類
     2.error,java的虛擬機錯誤,比較嚴重。處理不了.不用處理。編譯是不會出錯
     3.Exception:異常{
 一個特殊的子類,RuntimeException這個類的所有的子類都是運行的時候異常,不必要處理,編譯時不會報錯.交給默認的處理程序.其它的子類都是編譯時異常,比較嚴重的錯誤!在方法後面應該跑出去,我們在調用方法一定要處理.否則編譯器會報錯。
 }
     4.異常處理方式:try {} catch捕獲異常,throws 向外拋出一個異常
     5.thorw 與throws 的區別?
                         throws聲明方法向外拋出一個異常
                         throw和return一樣,只不過是要創建一個對象
 注意:
                         拋出一個對象,一定需要在方法外面聲明拋出一個異常.
 
     6.自定義異常:
     1.可以自己寫一個類繼承與Exception,這個類就是編譯時異常
     2.可以自己寫一個類繼承於RuntimeException,這個類就是運算期間異常
 
         
 面試題目:
 
 1.請說說final 與 finalize 和 finally的區別?三者有什麼共同點?
 解答: 除了單詞有點像,他們都是沒什麼緣分的..
 1.final是java的修飾關鍵字.修飾類,類不能被繼承.修飾屬性.屬性會編程常量.不能修改的值.修飾方法.這個方法不能被重寫.
 2.finalize:是在Object類當中定義的一個方法,所有的類都是默認繼承與Object類.也就是說:繼承了這個方法.當對象被垃圾回收之前.jvm會自動的調用該對象的finalize方法,所以我們一般通過finalize來做一些內存釋放的工作..
 3.finally :java中的關鍵字,必須結合try語句一起來使用.寫在finally代碼中的語句.一定會被執行.除非jvm退出。
 
 class MyException extends Exception
 {
     public String getMessage()
     {
         return "上帝~~";
     }
 }
 
 class Student
 {
     public void readBook(int num) throws Exception
     {
         if(num >300 || num <1){
             throw new Exception(){ //返回一個對象
                 //匿名內部類.重寫了父類的方法!
                 public String getMessage()
                 {
                         return "你在吹牛嗎?";
                 }
         };
         }
         else
         {
                 System.out.println("好孩子!");
         }
         
     }
 
     public void eat(int week) throws MyException  //向外拋出去一個異常
     {
         if(week<1||week>7)
                 throw new MyException();  //結束,有了一個對象!
         else
             System.out.println("星期是正確的!!");
     }
 }
 class Demo10 
 {
     public static void main(String[] args) 
     {
         try
         {
             new Student().readBook(400);
         }
         catch (Exception e)
         {
             e.printStackTrace();
         }
     
 
     try
     {
         new Student().eat(88);
     } 
     catch (Exception e)   //父類型的引用所指向子類型的對象  Exception e = new MyException();
     {
         e.printStackTrace();
     }
 
     }
 }
 
 
 1.    封裝性:
 1)類的封裝:將屬性都私有化(private),防止外界的直接訪問,對外提供s    et 與get方法。
 優點:隱藏內部實現過程,方便權限的管理
             
 2)方法的封裝:在實現功能的時候,應該儘可能的多抽取方法,儘量將別人用不到的方法私有化,實現一個封裝性。將提供方法進行功能調用方法設置爲公有的public就可以
 優點:讓類看起來更加的整潔,對外隱藏了實現的細節。
 
 2.    抽象:
 a)    爲了描述顯示的事物,在程序中通過對象來映射顯示中類的事物(萬物皆對象)
 b)    將一組特徵相似的對象共同的特徵和行爲抽象出一個類來定義
 c)    類的成員變量(屬性)來描述特徵,用成員方法來描述對象的行爲
 3.    繼承:
 a)    使用extends 關鍵字讓子類繼承父類,子類就可以自動複用了父類的所有屬性和方法(非私有)
 b)    子類實例化過程:
 1.    子類的構造方法一定會調用父類的構造方法,可以在第一行使用this(實參)來調用自己其他的構造方法,使用super(實參)來調用父類的構造方法
 2.    如果第一行沒有聲明,jvm會自動調用父類的無參的構造方法
 3.    子類和父類之間的轉換
 1,可以將子類實例當做父類來用,反則不能.
 2,把子類當做父類來用時:調用方法是子類的(重寫的關係),這個是做了動態的綁定,如果是訪問屬性的(靜態的綁定)也就說:調用的數父類的屬性.
 3,把子類當做父類來使用時,不能調用子類特有方法,因爲編譯器會檢查語法,發現該父類沒有這個方法,會報錯!
 4,如果是把子類當做父類來使用的時候,這時候可以強制類型轉換,則再有把握:咱們都需要用instanceof來判斷一些對象的類型。 
 4.    多態:
 1.    把子類當做父類來用
 2.    我們在編程無時無刻不使用多態,在定義一個方法形參的時候,爲了便於方法的通用性,通常會將形參定義爲父類類型,最好是接口類型,當調用方法的時候.那麼就可以子類實例當做父類來使用,正因爲有了多態,我們經常把子類當做父類來使用。所以有了以下的規定。
 ii.    返回值類型必須和父類的一致,或者是父類返回值類型的子類實例
 iii.    子類不能有比父類更加嚴格的訪問權限,假設父類是 public 而你子類是:private  那麼在傳遞參數的時候,有可能會因爲訪問權限而出錯!所以java是不允許的.
 iv.    子類不能被父類拋出更多的異常.
 v.    異常: throw 拋出一個異常對象.方法外部也是需要向外聲明拋出一個異常
 
 
 彩票的搖獎過程:
 
 import java.util.Random;
  class Lottery
 {
     private int poorCount;
     private int luckyPoorCount;
     private int[] poor;
     private int []luckPoor;
 
     //構造函數在構造搖獎的對象
     Lottery(int poorCount,int luckyPoorCount)
     {
             this.poorCount = poorCount;
             this.luckyPoorCount = luckyPoorCount;
             setPoor();
     }
 
     //填充獎池
     private void setPoor()
     {
             /*
                     怎麼做?
             1.根據poorCount創建數組,
             2.將1~poorCount填充數組,
             */
         int[] arr = new int[poorCount];
         for(int i=0; i<poorCount; i++)
             arr[i] = i+1; //37個數字
         poor = arr;
         luckPoor = new int[luckyPoorCount];
     }
 
     public void run()
     {
             //搖出所有的中獎號碼放在中獎池中
             setLuckyPoor();
             //輸出所有的中獎號碼
             listLuckyPoor();
     }
 
     //獲得所有的中獎號碼~~
     public void setLuckyPoor()
     {
         //1.定義循環,循環次數是luckyPoorCount
         for(int i=0; i<luckyPoorCount; i++)
         {
                 //1.產生一個隨機的中獎號碼
                 int luckyNumber = getLuckyNumber();
                 //2.將中獎號碼從裏面刪除
                 deleteNumber(luckyNumber);
                 //3.將中獎號碼放在獎池中
                 luckPoor[i] = luckyNumber;
         }    
     }
 
     private int getLuckyNumber()
     {
         int randomNum = new Random().nextInt(poor.length);
         return poor[randomNum];
     }
 
     private void deleteNumber(int luckyNumber)
     {
         int[] newArr = new int[poor.length-1];
         int pos = 0;
         for(int i=0; i<poor.length; i++)
         {
                 if(poor[i] == luckyNumber)
                 continue;
                 newArr[pos++] = poor[i]; //幸運的數字
         }
         poor = newArr; 
     }
 
     private void  listLuckyPoor()
     {
             StringBuffer sb = new StringBuffer();
             for(int num : luckPoor)
                 sb.append(num +" ");
             System.out.println("中獎的號碼爲:");
             System.out.println(sb);
     }
 }
 
 public class Demo11 
 {
     public static void main(String[] args) 
     {
         Lottery lottery = new Lottery(36,7);
         lottery.run();
     }
 }

發佈了52 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章