天天看點

Scala 學習之面向對象(3)

==> 類

        ---> 類的定義

<code>class</code> <code>Student{</code>

<code>    </code><code>// 定義屬性</code>

<code>    </code><code>private</code> <code>var</code> <code>stuName</code><code>:</code><code>String </code><code>=</code> <code>"Tom"</code>

<code>    </code><code>private</code> <code>vat stuAge</code><code>:</code><code>Int </code><code>=</code> <code>18</code>

<code>    </code> 

<code>    </code><code>// 定義方法</code>

<code>    </code><code>def</code> <code>getStuName()</code><code>:</code><code>String </code><code>=</code> <code>stuName</code>

<code>    </code><code>def</code> <code>setStuName(newName</code><code>:</code><code>String) </code><code>=</code> <code>{</code>

<code>        </code><code>this</code><code>.stuName </code><code>=</code> <code>newName</code>

<code>    </code><code>}</code>

<code>}</code>

        ---&gt; 伴生類和伴生對象    object 相當于 Java 中的 static

            ---- object 對象可以跟類名不一樣,如果跟類名一樣,這個對象就是該類的伴生對象,反之,這個類就是這個伴生對象的伴生類

        ---&gt; set 和 get 方法  

            ---- Scala 中,會自動給 private 定義的屬性生成get和set 方法,使用 val 可以使其隻生成 get 方法,而不會生成set 方法

            ---- 在定義變量時使用 this 關鍵字,可以使其成為此類的私有屬性,不會生成 get 和 set 方法,如:

<code> </code><code>// 定義正常的屬性,可自動生成get 和 set  方法</code>

<code> </code><code>private</code> <code>var</code> <code>aaa</code><code>:</code><code>String </code><code>=</code> <code>"hello"</code>

<code> </code> 

<code> </code><code>// 定義隻可自動生成 get 方法的屬性</code>

<code> </code><code>private</code> <code>val</code> <code>aaa</code><code>:</code><code>String </code><code>=</code> <code>"hello"</code>

<code> </code><code>// 使用this 關鍵字,使其定義的屬性成為此類的私有屬性,不允許外界通路</code>

<code> </code><code>private</code><code>[</code><code>this</code><code>] </code><code>var</code> <code>aaa</code><code>:</code><code>String </code><code>=</code> <code>"hello"</code>

        ---&gt; 嵌套類(内部類)

            ---- 内部類中的參數可以當做類的參數傳遞

        ---&gt; 類的構造器

            ---- 主構造器 和類的聲明在一起,隻能有一個主構造器

<code>class</code> <code>Student(</code><code>val</code> <code>stuName</code><code>:</code> <code>String, </code><code>val</code> <code>stuAge</code><code>:</code> <code>Int){</code>

<code>object</code> <code>Student{</code>

<code>    </code><code>def</code> <code>main(args</code><code>:</code> <code>Array[String])</code><code>:</code> <code>Unit </code><code>=</code> <code>{</code>

<code>        </code><code>var</code> <code>stu </code><code>=</code> <code>new</code> <code>Student(</code><code>"Tom"</code><code>, </code><code>20</code><code>)</code>

<code>        </code><code>println(stu.stuName + </code><code>"\t"</code> <code>+ stu.stuAge)</code>

            ---- 輔助構造器  可以有多個輔助構造器,使用 this 關鍵字

<code>class</code> <code>Student(</code><code>val</code> <code>stuName</code><code>:</code><code>String, </code><code>val</code> <code>stuAge</code><code>:</code><code>Int){</code>

<code>    </code><code>// 定義一個輔助構造器</code>

<code>    </code><code>def</code> <code>this</code><code>(age</code><code>:</code><code>Int){</code>

<code>    </code><code>// 調用主構造器</code>

<code>    </code><code>this</code><code>(</code><code>"No Name"</code><code>, age)</code>

<code>object</code> <code>Student{  </code><code>// </code>

<code>    </code><code>var</code> <code>stu </code><code>=</code> <code>new</code> <code>Student(</code><code>22</code><code>)</code>

<code>    </code><code>println(stu.stuName + </code><code>"\t"</code> <code>+ stu.stuAge)</code>

<code>}    </code><code>// 輸出結果為 NoName   22</code>

        ---&gt; Object 對象: 相當于 Java 中的 static 關鍵字

            ---- 單例模式: 一個類隻有一個對象

<code>// 生成信用卡的卡号</code>

<code>object</code> <code>CreditCard{</code>

<code>    </code><code>// 定義變量: 儲存信用卡的卡号</code>

<code>    </code><code>// 該屬性隻屬于該對象 </code>

<code>    </code><code>private</code><code>[</code><code>this</code><code>] </code><code>var</code> <code>creditCardNumbe</code><code>:</code><code>Long </code><code>=</code> <code>0</code>

<code>    </code><code>// 産生卡号</code>

<code>    </code><code>def</code> <code>generateNewCCNumber()</code><code>:</code><code>Long </code><code>=</code> <code>{</code>

<code>        </code><code>creditCardNumbe +</code><code>=</code> <code>1</code>

<code>        </code><code>creditCardNumber</code>

<code>    </code><code>// 測試程式</code>

<code>    </code><code>def</code> <code>main(args</code><code>:</code><code>Array[String])</code><code>:</code> <code>Unit </code><code>=</code> <code>{</code>

<code>    </code><code>// 得到新的卡号</code>

<code>        </code><code>println(CreditCard.generateNewCCNumber)</code>

            ---- 應用程式對象: App   ----- 可以省略 main 方法

<code>object</code> <code>testApp </code><code>extends</code> <code>App {</code>

<code>    </code><code>// 省略了 main 方法,可以直接将結果輸出</code>

<code>    </code><code>println(</code><code>"hello"</code><code>)</code>

        ---&gt; 類的 apply 方法

            ---- 作用: 建立對象時,省略 new 關鍵字,需要定義在類的伴生對象中

<code>class</code> <code>Student(stuName</code><code>:</code><code>String){</code>

<code>    </code><code>// 定義 apply 方法,必須定義在類的伴生對象中</code>

<code>    </code><code>def</code> <code>apply(stuName</code><code>:</code> <code>String) </code><code>=</code> <code>{</code>

<code>        </code><code>// 調用主構造器</code>

<code>        </code><code>new</code> <code>Student(stuName)</code>

<code>        </code><code>var</code> <code>stu </code><code>=</code> <code>Student(</code><code>"Tom"</code><code>)</code>

==&gt; 繼承

        ---&gt; 簡單繼承

<code>// 測試</code>

<code>object</code> <code>DemoExtends{</code>

<code>  </code><code>def</code> <code>main(args</code><code>:</code> <code>Array[String])</code><code>:</code> <code>Unit </code><code>=</code> <code>{</code>

<code>    </code><code>// 建立一個 Person 對象</code>

<code>    </code><code>val</code> <code>p</code><code>1</code><code>:</code><code>Person </code><code>=</code> <code>new</code> <code>Person(</code><code>"Tom"</code><code>, </code><code>20</code><code>)</code>

<code>    </code><code>println(p</code><code>1</code><code>.sayHello())            </code><code>// My name is Tom,age is 20</code>

<code>    </code><code>// 建立一個子類</code>

<code>    </code><code>val</code> <code>p</code><code>2</code><code>:</code><code>Person </code><code>=</code> <code>new</code> <code>Employee(</code><code>"Marry"</code><code>, </code><code>32</code><code>, </code><code>1233</code><code>)</code>

<code>    </code><code>println(p</code><code>2</code><code>.sayHello())            </code><code>// 子類中的 sayHello</code>

<code>    </code><code>// 建立一個匿名子類</code>

<code>    </code><code>val</code> <code>p</code><code>3</code><code>:</code><code>Person </code><code>=</code> <code>new</code> <code>Person(</code><code>"Jerry"</code><code>, </code><code>33</code><code>){</code>

<code>      </code><code>override</code> <code>def</code> <code>sayHello()</code><code>:</code> <code>String </code><code>=</code> <code>"匿名函數中的 sayHello 方法"</code>

<code>    </code><code>println(p</code><code>3</code><code>.sayHello())            </code><code>// 匿名函數中的 sayHello 方法</code>

<code>  </code><code>}</code>

<code>// 父類</code>

<code>class</code> <code>Person(</code><code>val</code> <code>name</code><code>:</code><code>String, </code><code>val</code> <code>age</code><code>:</code><code>Int){</code>

<code>  </code><code>def</code> <code>sayHello()</code><code>:</code><code>String </code><code>=</code> <code>"My name is "</code> <code>+ name + </code><code>",age is "</code> <code>+ age</code>

<code>// 子類    如果需要子類的值覆寫父類的值,需要加上 override 參數</code>

<code>class</code> <code>Employee(</code><code>override</code> <code>val</code> <code>name</code><code>:</code><code>String, </code><code>override</code> <code>val</code> <code>age</code><code>:</code><code>Int, </code><code>val</code> <code>salary</code><code>:</code><code>Int) </code><code>extends</code> <code>Person(name, age){</code>

<code>  </code><code>override</code> <code>def</code> <code>sayHello()</code><code>:</code> <code>String </code><code>=</code> <code>"子類中的 sayHello"</code>

        ---&gt; 繼承抽象類和抽象字段

<code>object</code> <code>TestExtendsDemo {</code>

<code>    </code><code>var</code> <code>apple</code><code>:</code><code>Fruit </code><code>=</code> <code>new</code> <code>Apple()</code>

<code>    </code><code>var</code> <code>orange</code><code>:</code><code>Fruit </code><code>=</code> <code>new</code> <code>Orange()</code>

<code>    </code><code>println(apple.name())        </code><code>// 結果為 apple</code>

<code>    </code><code>println(orange.name())        </code><code>// 結果為 orange</code>

<code>abstract</code> <code>class</code> <code>Fruit{</code>

<code>  </code><code>var</code> <code>id</code><code>:</code><code>Int</code>

<code>  </code><code>def</code> <code>name()</code><code>:</code><code>String</code>

<code>  </code> 

<code>class</code> <code>Apple </code><code>extends</code> <code>Fruit{</code>

<code>   </code><code>// 實作抽象字段</code>

<code>   </code><code>var</code> <code>id</code><code>:</code><code>Int </code><code>=</code> <code>1</code>

<code>  </code><code>// 實作抽象方法</code>

<code>  </code><code>def</code> <code>name()</code><code>:</code><code>String </code><code>=</code> <code>{</code>

<code>    </code><code>"apple"</code>

<code>// 可以通過構造方法對抽象字段進行處理</code>

<code>class</code> <code>Orange() </code><code>extends</code> <code>Fruit{</code>

<code>  </code><code>def</code> <code>name</code><code>:</code><code>String </code><code>=</code> <code>{</code>

<code>    </code><code>"orange"</code>

        ---&gt; 特質trait: 有點像接口,也有點像抽象類    支援多重繼承,可以定義抽象方和字段,也可以定義完整的方法和字段

<code>object</code> <code>Demo</code><code>1</code> <code>{</code>

<code>    </code><code>var</code> <code>com</code><code>:</code><code>Computer </code><code>=</code> <code>new</code> <code>Computer(</code><code>1</code><code>)</code>

<code>    </code><code>println(com.run())</code>

<code>    </code><code>println(com.movedown())</code>

<code>class</code> <code>Computer(</code><code>var</code> <code>monitorid</code><code>:</code><code>Int) </code><code>extends</code> <code>Monitor </code><code>with</code> <code>Mouse </code><code>with</code> <code>Keyboard {</code>

<code>  </code><code>def</code> <code>run()</code><code>:</code><code>String </code><code>=</code> <code>{</code>

<code>    </code><code>"running"</code>

<code>  </code><code>def</code> <code>moveup()</code><code>:</code> <code>String </code><code>=</code> <code>{</code>

<code>    </code><code>"moveup"</code>

<code>  </code><code>override</code> <code>def</code> <code>movedown()</code><code>:</code> <code>String </code><code>=</code> <code>{</code>

<code>    </code><code>"movedown"</code>

<code>  </code><code>override</code> <code>def</code> <code>press()</code><code>:</code> <code>String </code><code>=</code> <code>{</code>

<code>    </code><code>"press"</code>

<code>trait</code> <code>Monitor{</code>

<code>  </code><code>var</code> <code>monitorid</code><code>:</code><code>Int</code>

<code>  </code><code>def</code> <code>run()</code><code>:</code><code>String</code>

<code>trait</code> <code>Mouse{</code>

<code>  </code><code>def</code> <code>moveup()</code><code>:</code><code>String</code>

<code>  </code><code>def</code> <code>movedown()</code><code>:</code><code>String</code>

<code>trait</code> <code>Keyboard{</code>

<code>  </code><code>def</code> <code>press()</code><code>:</code><code>String</code>

==&gt; 包的定義和使用

        ---&gt; 包的定義:

<code>// 定義格式一</code>

<code>package</code> <code>com.mytest</code>

<code>class</code> <code>Demo{}</code>

<code>// 定義格式二</code>

<code>package</code> <code>com.mytest{</code>

<code>    </code><code>class</code> <code>Demo{}</code>

        ---&gt; 包的使用(引入):

<code>import</code> <code>com.mytest.Demo        </code><code>// 可以不寫Demo 的全路徑</code>

<code>import</code> <code>com.mytest.</code><code>_</code>            <code>// 引入mytest 包下所有的屬性</code>

<code>import</code> <code>com.mytest.Demo.</code><code>_</code>        <code>// 引入 Demo 類中所有的屬性</code>

==&gt; 包對象

<code>package</code> <code>object</code> <code>MyPackageDemo{</code>

<code>    </code><code>// 常量</code>

<code>    </code><code>val</code> <code>a</code><code>:</code><code>Int </code><code>=</code> <code>1</code>

<code>    </code><code>// 變量</code>

<code>    </code><code>var</code> <code>a</code><code>:</code><code>String </code><code>=</code> <code>"hello"</code>

<code>    </code><code>// 方法</code>

<code>    </code><code>def</code> <code>Demo()</code><code>:</code><code>String </code><code>=</code> <code>{</code>

<code>        </code><code>"Demo"</code>

<code>    </code><code>// 類</code>

<code>    </code><code>class</code> <code>Demo{</code>

<code>        </code> 

<code>    </code><code>// 對象 object</code>

<code>    </code><code>object</code> <code>Demo{</code>

<code>    </code><code>// trait(特質)</code>

<code>    </code><code>trait</code> <code>Demo{</code>

本文轉自 菜鳥的征程 51CTO部落格,原文連結:http://blog.51cto.com/songqinglong/2071907