Scala-類骂因、對象炎咖、繼承、特質(zhì)

1寒波、類
1乘盼、類的定義和訪問限制符

/**
  * 類的定義,變量聲明與訪問限制
  * 在Scala中俄烁,類并不用聲明為public蹦肴。
  *Scala源文件中可以包含多個(gè)類,所有這些類都具有公有可見性猴娩。
  * Created by 12706 on 2017/11/27.
  */
//private[scu]:包可見性scu是包名阴幌,除了該包和子包其他包不可見
//Person private表示構(gòu)造器(無參的主構(gòu)造器)私有化了,除了伴生對象外其他對象里面一旦創(chuàng)建運(yùn)行會(huì)出錯(cuò)
private[scu] class Person private {

  //val修飾的屬性,外部只能訪問該屬性而不能修改(反編譯后能看到只有g(shù)et方法而沒有set方法)
  val id = 110
  //var 修飾的屬性卷中,既有g(shù)et方法也有set方法
  var name = "小明"

  //private修飾的屬性(類私有字段)只能在當(dāng)前類(以及伴生對象 object Person)中訪問
  private val age : Int = 18

  //對象私有字段,訪問權(quán)限更加嚴(yán)格的矛双,連伴生對象都不能訪問,只能當(dāng)前類才行
  private[this] val height : Int = 16

  //getHeight()當(dāng)然也行
  private def getHeight = {
    height
  }

}

//伴生對象,類和伴生對象之間可以相互訪問私有的方法和屬性
object Person {

  def main(args: Array[String]): Unit = {
    //創(chuàng)建對象,當(dāng)然用new Person()也行
    val p = new Person

    //訪問對象屬性,訪問不到height屬性
    println("id:" + p.id)
    println("姓名:" + p.name)
    println("年齡:" + p.age)
    //通過方法獲height屬性
    val height = p.getHeight;
    println("身高:" + height)

    //修改屬性,只能修改到name
    p.name = "小雨"
    println("姓名:" + p.name)

  }

}

class Man {}
object Man {
  def main(args: Array[String]): Unit = {
//    運(yùn)行會(huì)出錯(cuò)蟆豫,因?yàn)闃?gòu)造器被私有化了
//   val p = new Person
  }
}

對上面的demo進(jìn)行反編譯议忽,java代碼一目了然

public class Person
{
  private final int id = 110;

  private String name = "小明";

  private final int main$java$cn$scu$scala$day02$Person$$age = 18;

  private final int height = 16;

  public static void main(String[] paramArrayOfString)
  {
    Person..MODULE$.main(paramArrayOfString);
  }

  public int id()
  {
    return this.id;
  }
  public String name() { return this.name; } 
  public void name_$eq(String x$1) { this.name = x$1; }

  public int main$java$cn$scu$scala$day02$Person$$age() {
    return this.main$java$cn$scu$scala$day02$Person$$age;
  }

  public int main$java$cn$scu$scala$day02$Person$$getHeight()
  {
    return this.height;
  }
}

2、構(gòu)造器

/**
  * 每個(gè)類都有主構(gòu)造器十减,主構(gòu)造器的參數(shù)直接放置類名后面栈幸,與類交織在一起
  * Created by 12706 on 2017/11/27.
  */
//height : Int 相當(dāng)于private[this] height : int
//反編譯的時(shí)候能看到成員變量有id,name,age
class People(val id : Int, var name : String, height : Int, private var age : Int = 18)  {

}

object People {
  def main(args: Array[String]): Unit = {

    //age有初始值所以創(chuàng)建對象時(shí)可以不指定
    val p = new People(1,"小明",60);
    //訪問不了height屬性愤估,height為對象私有字段
    println(p.id + " " +p.age + " " +p.name)

    val p2 = new People(1,"小明",60,28);
    println(p2.id + " " +p2.age + " " +p2.name)

  }
}
輸出
1 18 小明
1 28 小明
/**
  * 輔助構(gòu)造器的定義
  * Created by 12706 on 2017/11/27.
  */
class Student(val id : Int, val name : String) {

  println("執(zhí)行主構(gòu)造器!")

  //用this關(guān)鍵字定義輔助構(gòu)造器
  def this(id : Int, name : String, age : Int){
    //每個(gè)輔助構(gòu)造器必須以主構(gòu)造器或其他的輔助構(gòu)造器的調(diào)用開始
    this(id,name)
    println("執(zhí)行輔助構(gòu)造器")
  }
}
object Student {
  def main(args: Array[String]): Unit = {
    val stu = new Student(1,"小明",20)
    //同樣還是訪問不到age的
    println(stu.name)
  }
}
/**
  * 主構(gòu)造器會(huì)執(zhí)行類定義中的所有語句
  * Created by 12706 on 2017/11/27.
  */
class Prop {

  println("執(zhí)行主構(gòu)造器")

  //定義方法
  def method(): Unit ={
    println("用我來讀取文件內(nèi)容 !")
  }

  //讀取外部文件內(nèi)容
  try {
    //讀取的整個(gè)文件后轉(zhuǎn)為String
    val context = Source.fromFile("d://words.txt").mkString
    println(context)
  }catch {
    case e :Exception => e.printStackTrace()
  }finally {
    println("讀取文件完畢")
  }


}
object Prop {
  def main(args: Array[String]): Unit = {
      val prop = new Prop
      println("================")

      prop.method
  }
}
輸出
執(zhí)行主構(gòu)造器
hello tom
hello jerry
hello tom
hello jerry
hello tom
hello tom
讀取文件完畢
================
用我來讀取文件內(nèi)容 !

2速址、對象
1、單例對象
在Scala中沒有靜態(tài)方法和靜態(tài)字段昔园,但是可以使用object這個(gè)語法結(jié)構(gòu)來達(dá)到同樣的目的
1.存放工具方法和常量
2.高效共享單個(gè)不可變的實(shí)例
3.單例模式

/**
  * java中SessionFactory(hibernate或者是mybatis(SqlSessionFactory))的設(shè)計(jì)就是
  * 單例的默刚,通過它來獲取Session對象荤西。使用scala來進(jìn)行簡單模擬
  * Created by 12706 on 2017/11/27.
  */
//下面相當(dāng)于java的靜態(tài)塊
object SessionFactory{
  var counts = 5;
  val buffer = new ArrayBuffer[Session](5)
  while (counts>0) {
    //給buffer緩存塞入5個(gè)Sessio對象
    val session = new Session
    buffer += session
    counts -= 1
  }

  //獲取session對象,相當(dāng)于java的靜態(tài)方法
  def getSession(): Unit ={
    //緩存中取session
    buffer.remove(0)
  }

  def main(args: Array[String]): Unit = {
    //單例對象邪锌,不需要new养篓,用【類名.方法】調(diào)用對象中的方法
    val session = SessionFactory.getSession
    println(session)
  }
}
class Session {
}

2柳弄、伴生對象
在Scala的類中碧注,與類名相同的對象叫做伴生對象,類和伴生對象之間可以相互訪問私有的方法和屬性

/**
  * 伴生對象與類之間私有屬性的訪問
  * Created by 12706 on 2017/11/27.
  */
class Dog {
  private val name : String = "旺財(cái)"
  def bark(){
    //訪問伴生對象的私有屬性
    println(Dog.voice)
  }
}
object Dog {
 private val voice : String = "wangwang"

  def main(args: Array[String]): Unit = {
    val dog = new Dog
    //訪問對象的私有name屬性
    println(dog.name)
    dog.bark()
  }
}

2轩端、apply方法

/**
  * apply方法:通常我們會(huì)在類的伴生對象中定義apply方法基茵,
  * 當(dāng)遇到類名(參數(shù)1,...參數(shù)n)時(shí)apply方法會(huì)被調(diào)用
  * Created by 12706 on 2017/11/27.
  */
class Point {

  private var x : Int = 2

  println("主構(gòu)造器被調(diào)用")

  def this(x : Int){
    this()
    this.x = x
  }

}

object Point {

  def apply(): Unit ={
    println("apply()方法被調(diào)用")
  }

  def apply(x : Int, y : Int): Unit = {
    println("apply(x : Int, y : Int)方法被調(diào)用")
  }

  def apply(x : Int): Point = {
    println("apply(x : Int)方法被調(diào)用")
    new Point(x)
  }

  def main(args: Array[String]): Unit = {

    val p1 = new Point
    println("===================")
    //注意兩者區(qū)別,調(diào)用apply方法的時(shí)候不會(huì)執(zhí)行主構(gòu)造器方法
    val p2 = Point()

    val p3 = Point(3,4)
    println("===================")

    val p4 = Point(3)
    println(p4.x)
  }
}
輸出
主構(gòu)造器被調(diào)用
===================
apply()方法被調(diào)用
apply(x : Int, y : Int)方法被調(diào)用
===================
apply(x : Int)方法被調(diào)用
主構(gòu)造器被調(diào)用
3

4、應(yīng)用程序?qū)ο?br> Scala程序都必須從一個(gè)對象的main方法開始根灯,可以通過擴(kuò)展App特質(zhì),不寫main方法纳猪。

/**
  * 應(yīng)用程序?qū)ο笫系蹋瑔卫龑ο螅ɑ蛘甙樯鷮ο螅├^承App即可丽猬,App中定義了main方法被繼承過來了
  * 所以AppDemo中不需要寫main方法了
  * Created by 12706 on 2017/11/27.
  */
object AppDemo extends App{
  val arr = Array(1,2,3,4)
  println(arr.toBuffer)
}

3、繼承
1谬以、拓展類
在Scala中擴(kuò)展類的方式和Java一樣都是使用extends關(guān)鍵字为黎,但是并沒有使用implements來實(shí)現(xiàn)接口铭乾,都是用extends炕檩。如果繼承一個(gè)類的同時(shí)也實(shí)現(xiàn)了很多接口,那么用extends 父類 with 接口1 with 接口2 with…

2泉沾、方法的重寫
方法重寫就是子類中對父類的方法實(shí)現(xiàn)重寫跷究。
java中接口中都是抽象方法俊马,但是scala中可以有實(shí)現(xiàn)肩杈,而且關(guān)鍵字是trait稱為特質(zhì)锋恬。但是重寫一個(gè)非抽象方法必須使用override關(guān)鍵字。

3彤悔、類型檢查和轉(zhuǎn)換
obj.isInstanceOf[C](scala中) ,obj instanceof C(java中)晕窑。obj是不是C類型
obj.asInstanceOf[C](scala中)杨赤,(C)obj(java中)疾牲,obj類型強(qiáng)轉(zhuǎn)為C類型。
classOf[C](scala中)焰枢,C.class济锄。獲取C類型

/**
  * Men是Human類(繼承類)荐绝,同時(shí)擁有動(dòng)物的行為(實(shí)現(xiàn)接口)
  * Created by 12706 on 2017/11/27.
  */
//Human是類必須接在extends后面
class Men extends Human with Animall{
  def say(): Unit = {
    println("大家好,我的名字叫:" + name)
  }

  //重寫父類已經(jīng)實(shí)現(xiàn)的方法需要加override關(guān)鍵字低滩,父類沒實(shí)現(xiàn)那么可加可不加
  override def getName(): String = {
    this.name
  }
}
object Men {
  def main(args: Array[String]): Unit = {
    val man = new Men
    man.name = "xiaoming"

    man.say()
    println(man.getName())

    //類型檢查
    val b = man.isInstanceOf[Animall]
    println(b)

  }
}

abstract class Human {
  var name : String = _
  def say()
}

trait Animall {

  def getName(): String = {
    "monkey"
  }
}
輸出
大家好,我的名字叫:xiaoming
xiaoming
true

_ 對變量進(jìn)行默認(rèn)初始化委造,比如var i:Int=_

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爬虱,隨后出現(xiàn)的幾起案子腾它,更是在濱河造成了極大的恐慌瞒滴,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笤虫,居然都是意外死亡琼蚯,警方通過查閱死者的電腦和手機(jī)遭庶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門台诗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拉队,“玉大人粱快,你說我怎么就攤上這事事哭△⒃郏” “怎么了谤辜?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵涡戳,是天一觀的道長渔彰。 經(jīng)常有香客問我编整,道長掌测,這世上最難降的妖魔是什么汞斧? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮庙睡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啡邑。我一直安慰自己谤逼,他們只是感情好流部,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布恰画。 她就那樣靜靜地躺著拴还,像睡著了一般端盆。 火紅的嫁衣襯著肌膚如雪焕妙。 梳的紋絲不亂的頭發(fā)上焚鹊,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音嚷炉,去河邊找鬼。 笑死哗讥,一個(gè)胖子當(dāng)著我的面吹牛忌栅,可吹牛的內(nèi)容都是我干的湖员。 我是一名探鬼主播窄坦,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼肠缨,長吁一口氣:“原來是場噩夢啊……” “哼闻书!你這毒婦竟也來了砰盐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藕各,失蹤者是張志新(化名)和其女友劉穎作彤,沒想到半個(gè)月后浙踢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛波,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年胰舆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬挤。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缚窿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焰扳,到底是詐尸還是另有隱情倦零,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布吨悍,位于F島的核電站扫茅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏育瓜。R本人自食惡果不足惜葫隙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爆雹。 院中可真熱鬧停蕉,春花似錦愕鼓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚓挤,卻和暖如春磺送,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灿意。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工估灿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缤剧。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓馅袁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荒辕。 傳聞我的和親對象是個(gè)殘疾皇子汗销,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!抵窒! 因?yàn)镾cala是基于Java虛擬機(jī)弛针,也就是...
    燈火gg閱讀 3,446評論 1 24
  • 1.1. 什么是Scala Scala是一種多范式的編程語言,其設(shè)計(jì)的初衷是要集成面向?qū)ο缶幊毯秃瘮?shù)式編程的各種特...
    文子軒閱讀 1,533評論 1 3
  • 今天一早起來李皇,外面宛如仙境削茁,我拍了幾張,請看仙境小區(qū): 湖邊的櫻花沾了小水滴掉房,葉子很美 樹枝上有個(gè)小蜘蛛茧跋,織了網(wǎng),...
    lemei閱讀 175評論 0 2
  • 醫(yī)院里消毒水的氣味,總夾雜著陳舊的情緒 他們說未來要遇到的人捍岳,會(huì)有各種途徑侵襲 打開筆記本的那刻,誤打誤撞的你突然...
    火鍋不暖閱讀 752評論 5 7
  • ——————給我最愛最愛的老妹 10年的12月睬隶,你誕生在地球上锣夹,那時(shí)我還在學(xué)校,并...
    Switches閱讀 307評論 2 1