scala面向对象

一.包嵌套
( 1)一个源文件中可以声明多个 package
( 2)子包中的类可以直接访问父包中的内容,而无需导包
( 3)包对象:在 Scala 中可以为每个包定义一个同名的包对象, 定义在包对象中的成员, 作为其对
应包下所有 class 和 object 的共享变量, 可以被直接访问。
( 4)导包说明

图片.png

(1)scala里的setget: @BeanPropetry

    class Person {
      var name: String = "bobo" //定义属性
      var age: Int = _ // _表示给属性一个默认值
      //Bean 属性( @BeanProperty)
      @BeanProperty var sex: String = "男"
      //val 修饰的属性不能赋默认值,必须显示指定
    }

封装

一.概念
Scala 中的 public 属性,底层实际为 private,并通过 get 方法( obj.field())和 set 方法
( obj.field_=(value))对其进行操作。所以 Scala 并不推荐将属性设为 private,再为其设置
public 的 get 和 set 方法的做法。但由于很多 Java 框架都利用反射调用 getXXX 和 setXXX 方
法,有时候为了和这些框架兼容,也会为 Scala 的属性设置 getXXX 和 setXXX 方法(通过
@BeanProperty 注解实现)

二.访问权限

( 1) Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。
( 2) private 为私有权限,只在类的内部和伴生对象中可用。
( 3) protected 为受保护权限, Scala 中受保护权限比 Java 中更严格,同类、子类可以
访问,同包无法访问

( 4) private[包名]增加包访问权限,包名下的其他类也可以使用

对象

1.自动推导变量类型不能多态,所以多态需要显示声明(?)

2.构造器:Scala包括主构造器和辅助构造器。
注:辅助构造器不能直接构建对象,必须直接或间接调用主构造方法。

3.构造器里的三种参数设置

class Test(name:String,var age:Int,val sex:String) {
  /*
  * name:局部变量
  * age:成员变量
  * sex:只读成员变量
  * */
  var name1:String = name
}

继承和多态

1.scala中属性和方法都是动态绑定

      class a{
        val name:String = "a"
        def hello(): Unit = {
          println("hello a")
        }
      }
      class aSon extends a{
        override val name:String = "aSon"
        override def hello(): Unit = println("hello b")
      }
      object Test{
        def main(args: Array[String]): Unit = {
          var aa = new aSon
          println(aa.name)
          aa.hello()
        }
      }

输出是:aSon ,hello b。如果是java,输出是a,hello b

抽象类

1.重写非抽象方法需要用 override 修饰,重写抽象方法则可以不加 override
2.子类中调用父类的方法使用 super 关键字
3.子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用,没有必要重写(但是写var不会报错)

匿名子类

                //Person是抽象类
    val person = new Person {
    override val name: String = "teacher"
    override def hello(): Unit = println("hello teacher")

单例对象(伴生对象)

Scala语言是完全面向对象的语言, 所以并没有静态的操作( 即在Scala中没有静态的概

念) 。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象
来模拟类对象, 该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴
生对象,这个类的所有“静态” 内容都可以放置在它的伴生对象中声明。

说明

( 1)单例对象采用 object 关键字声明

( 2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。

( 3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

**apply方法**

( 1)通过伴生对象的 apply 方法, 实现不使用 new 方法创建对象。

( 2)如果想让主构造器变成私有的,可以在()之前加上 private。

( 3) apply 方法可以重载。

( 4) Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用
以统一面向对象编程和函数式编程的风格。

( 5)当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构
建对象时,调用的其实时伴生对象的 apply 方法。

特质(接口)

基础
1.所有的 Java 接口都可以当做 Scala 特质使用
2.动态混入:可灵活的扩展类的功能

    val t2 = new Teacher with SexTrait {
                  override var sex: String = "男"
    }
    println(t2.sex)

特质叠加
第一种,一个类( Sub)混入的两个 trait( TraitA, TraitB)中具有相同的具体方法,且两个 trait 之间没有任何关系,解决这类冲突问题,直接在类( Sub)中重写冲突方法

图片.png

第二种,一个类( Sub)混入的两个 trait( TraitA, TraitB)中具有相同的具体方法,且两个 trait 继承自相同的 trait( TraitC),及所谓的“钻石问题”,解决这类冲突问题, Scala采用了特质叠加的策略。


图片.png

注:特质叠加顺序

图片.png

特质自身类型

使用_:Name(with Name)=>this:Name(with Name)=> 将Name类/接口/特质注入

class User(val name: String, val age: Int)
class Dao {
  def insert(user: User) = {
    println("insert into database :" + user.name)
  }
}
trait APP {
  _: Dao =>
  def login(user: User): Unit = {
    println("login :" + user.name)
    insert(user)
  }
}
object MyApp extends Dao with APP{
  def main(args: Array[String]): Unit = {
    login(new User("bobo", 11))

  }
}

特质和抽象类的区别

1.优先使用特质。一个类扩展多个特质是很方便的,但却只能扩展一个抽象类。

2.如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,
而特质不行( 有无参构造)

**类型检查和转换
( 1) obj.isInstanceOf[T]:判断 obj 是不是 T 类型。
( 2) obj.asInstanceOf[T]:将 obj 强转成 T 类型。
( 3) classOf 获取对象的类名。

val pClass: Class[Person] = classOf[Person]

枚举类和应用类

// 枚举类
object Color extends Enumeration {
val RED = Value(1, "red")
val YELLOW = Value(2, "yellow")
val BLUE = Value(3, "blue")
}
// 应用类
object test extends App {
//不用main方法就能执行
println(Color.RED)
}

type定义类型
就是给原有类型换个名

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

推荐阅读更多精彩内容