Scala(四)-①-面相对象初级

① 构造器

Why

构造器的设计目的是为了用来初始化对象,在Scala中构造器分为主构造器辅助构造器两种,辅助构造器必须调用主构造器来构造对象,并且必须放在第一行

How

语法
class  类名(形参列表) extends 父类名(父类构造器参数列表){  // 主构造器
      // 属性
      var 属性名1 : 类型1 = 形参1
      var 属性名2 : 类型2 = 形参2
      // 辅助构造器       
      def this(形参列表1) {  //  辅助构造器1
      }
      def this(形参列表2) {  //  辅助构造器1
      }
}
Demo
object ConstructDemo01 {
  def main(args: Array[String]): Unit = {

    val stu = new Student("lisi", 25)
    stu.print()

  }
}


class Student(inName :String, inAge :Int) {

  var name : String = inName
  var age : Int = inAge

  def this() {
    this("", 0)
    println("this construct")
  }


  def print(): Unit = {
    println(s"name = $name, age = $age")
  }


  println("main construct")
}

What

Scala的主构造器本质是什么?辅助构造器呢?

如下代码是使用反编译工具得到的代码,可加班Scala底层会生成两个Java类型的构造器分别对应.其本质还是java的构造器.

package com.sweetcs.bigdata.scala.day04.chapter07._01_construct;

import scala.Predef.;
import scala.StringContext;
import scala.reflect.ScalaSignature;
import scala.runtime.BoxesRunTime;

public class Student
{
  ...省略掉属性,现在只关注构造器  
  public Student()
  {
    this("", 0);
    Predef..MODULE$.println("this construct");
  }
  
  public void print()
  {
    Predef..MODULE$.println(new StringContext(Predef..MODULE$.wrapRefArray((Object[])new String[] { "name = ", ", age = ", "" })).s(Predef..MODULE$.genericWrapArray(new Object[] { name(), BoxesRunTime.boxToInteger(age()) })));
  }
  
  public Student(String inName, int inAge)
  {
    this.name = inName;
    this.age = inAge;
    
    Predef..MODULE$.println("main construct");
  }
}

Details

  • Scala的构造器不能直接调用super.且只有主要构造器能够调用父类构造器.
  • Scala的主构造器放在类名之后,并且如果有继承需在父类之后直接写明要调用的父类构造器.如果是无参数构造器可以都省略.
class Studentn(name :String ) extends Person(sno :String) {

}
  • Scala的辅助构造器名字都为this,最终必须要能``调用到主构造器.因为需要通过主构造器来调用父类构造器构造初始化父类成员
  • 默认的构造器访问权限是public,如果要声明为prive,需要在构造器前加private()
class Studentn private(name :String ) {

}

② 属性高级

Why

属性高级技术主要是提供更加便捷的创建属性的方式.我们需要了解每一种方式对应生成的是读写属性、还是只读、只写.

How

语法
  • Scala可以再构造器中直接生成属性,如果是val修饰生成只读属性.如果是var修饰读写属性
  • Scala可以使用@BeanProperty注解修饰属性,生成复合Bean规范的setter和getter
Demo
/**
  * @author sweetcs
  */
object PropertiesAdvance {
  def main(args: Array[String]): Unit = {

    val w1 = new WorkerOne("lisi")
    println(w1.name)
    println(w1.inName)         // 报错

    val w2 = new WorkerTwo("wangwu")
    println(w2.name)
    println(w2.inName)  // val是只读的私有属性
    w2.inName = "xxx"   // 报错

    val w3 = new WorkerThree("xiaoming")
    println(w3.name)
    println(w3.inName)  // var是 可读可写 的私有属性
    w3.inName = "xiaoliu"


    val w4 = new WorkerFour
    w4.setName("lisi")
    w4.getName
    println(w4.name, w4.getName)
    w4.name = "wangwu"
    println(w4.name, w4.getName)
  }
}

class WorkerOne(inName : String) {

  var name = inName

}

class WorkerTwo(val inName : String) {
  var name = inName
}

class WorkerThree(var inName : String) {
  var name = inName
}

class WorkerFour() {   // 自动生成Bean规范的setter和getter,且var name底层原有的set和get还保留
  @BeanProperty
  var name;
}

What

对应的底层反编译源码就不贴了,感兴趣的可以自己用JD-GUI反编译.

Details

  • 使用@BeanProperty自动生成Bean规范settergetter,且var name底层原有的set和get还保留

③ 对象的创建流程分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355