基本类的使用:(初)

  1. package com.dtspark.scala.basics
  2. /**
  3. * trait是一个接口
  4. * 接口的第一次继承用extends,多继承时用with
  5. * 多继承时,如果这些接口中都有同样的方法时,则是从右往左的顺序执行
  6. * 抽象类不能实例化
  7. * 类继承的时候不继承伴生对象object,只能看见类的接口,而其父类可以使用自己伴生对象中的方法
  8. * isInstanceOf 和 asInstanceOf的使用
  9. * 前者是判断是不是其子类,后者是进行类型转换,但必须是父子之间的转换,不能是完全不同的类
  10. */
  11. trait Logger{
  12. def log(message:String){
  13. println("logger "+message)
  14. }
  15.  
  16. }
  17. /**
  18. * override 是表示重写原有方法,(必须要写)
  19. */
  20. trait RichLogger extends Logger{
  21. override def log(message:String){
  22. println("RichLogger:"+message)
  23. }
  24. }
  25.  
  26. class Loggin( name:String)extends Logger{
  27. def loggin{
  28. println("Hi,welcome! "+name)
  29. log(name)
  30. }
  31.  
  32. }
  33.  
  34. trait Information{
  35.  
  36. val information:String //抽象属性
  37. //def getId:String
  38. def getInformation:String //抽象方法(不存在方法体)
  39. def checkIn:Boolean = {
  40. getInformation.equals("Spark")
  41. }
  42. }
  43.  
  44. class Passenger( name:String)extends Information{
  45. //不可以定义为val 原因是因为_的值不明确
  46. var id:String=_ //这种方法申明的不是抽象属性,而是可变属性,其值为String的默认值null
  47. override val information = name //重写抽象属性
  48. override def getInformation = information //不执行任何操作,直接给返回值,相当于实现了
  49. /**
  50. * this关键字为构造方法,重写构造方法
  51. * 副构造函数的第一行必须是构造函数
  52. */
  53. def this(name:String,iid:String){
  54. this(name)
  55. id=iid;
  56. println("hello!!")
  57. }
  58. def out:String={
  59. name+" : "+id
  60. }
  61.  
  62. }
  63.  
  64. object HelloTrait {
  65. def main(args: Array[String]): Unit = {
  66. /**
  67. * 对象实例化之后又继承了新的接口,可以使用新的方法
  68. * 新的接口必须继承至原有的接口,并重写新的方法
  69. */
  70. val Log = new Loggin("Spark")with RichLogger
  71. Log.loggin
  72.  
  73. val person = new Passenger("zcb")
  74. println(person.out)
  75. person.id="123" //不具有封装性
  76. println(person.out)
  77. val person1 = new Passenger("zcb1","1234")
  78. println(person1.out)
  79. val a:Boolean=person.isInstanceOf[Information]//看它是不是其子类
  80. println(a)
  81. }
  82. }

类的继承和判断对象是否相等(中)

  1. package com.dtspark.scala.basics
  2. /**
  3. *class Creature {
  4. * val range: Int = 10
  5. * val env: Array[Int] = new Array[Int](range)
  6. *}
  7.  
  8. *class Ant extends Creature {
  9. * override val range = 2
  10. *}
  11. * 在构造时,发生的过程如下:
  12. * Ant构造器在构造自己之前,调用超类构造器;
  13. * Creature的构造器将range字段设为10;
  14. * Creature的构造器初始化env数组,调用range字段的getter;
  15. * range的getter被Ant类重写了,返回的Ant类中的range,但是Ant类还未初始化,所以返回了0;
  16. * env被设置成长度为0的数组
  17. * Ant构造器继续执行,将range字段设为2
  18. * -------------------------------------------------------------
  19. * 第二种写法是先初始化sporter的成员,然后在初始化父类的成员,这样可保证将数据传给父类,with后面接要继承的类
  20. * class Person10{
  21. * val counter=3
  22. * val counterArray =new Array[Int](counter)
  23. * }
  24.  
  25. * class Sporter extends {
  26. * override val counter = 5
  27. * }with Person10
  28.  
  29. **/这样初始化后sportercounterArray的长度为5
  30. class Person10{
  31. val counter=3
  32. val counterArray =new Array[Int](counter)
  33. }
  34.  
  35. class Sporter extends {
  36. override val counter = 5
  37. }with Person10
  38.  
  39. //判断两个对象是否相同的方法
  40. class Programmer(val name:String,val salary:Double){
  41. final override def equals(other:Any)={
  42. val that = other.asInstanceOf[Programmer]
  43. if(that==null)false
  44. else name == that.name&&salary==that.salary
  45. }
  46. /**
  47. * 1.hashCode()方法存在的主要目的就是提高效率。
  48. * 2.在集合中判断两个对象相等的条件,其实无论是往集合中存数据,
  49. * 还是从集合中取数据,包括如果控制唯一性等,都是用这个条件判断的,条件如下:
  50. * 首先判断两个对象的hashCode是否相等,如果不相等,就认为这两个对象不相等,就完成了。
  51. * 如果相等,才会判断两个对象的equals()是否相等,如果不相等,就认为这两个对象不相等,
  52. * 如果相等,那就认为这两个对象相等。
  53.  
  54. * 所以说重写equals时必须重写hashcode,这是良好的习惯
  55. */
  56. final override def hashCode=name.hashCode()*5+salary.hashCode()*9
  57.  
  58. }
  59.  
  60. //object OverrideField {
  61. // def main(args: Array[String]): Unit = {
  62. // val s = new Sporter
  63. // println(s.counterArray.length)
  64. // }
  65. //}
  66. //第二种写法,不用写main函数
  67. object OverrideField extends App{
  68. val s = new Sporter
  69. println(s.counterArray.length)
  70. }

注:对于无序表寻找是否有相同的对象时,使用hashcode可以大大提高速度。equal的比较通常比较耗资源,可以先比较hashcode后,确认hashcode相同时再用equal比较。

hashcode相同,equal不一定相同;equal相同的hashcode一定相同。

类的提取器:(中)

  1. package com.dtspark.scala.basics
  2. /**
  3. * 类的提取器
  4. * 注解要搞懂下面两个
  5. * @transient 注解将字段标记为瞬态的
  6. * @volatile 注解标记为易失的
  7. *
  8. * 自己编写的注解要继承annotation.Annotation
  9. */
  10. case class Person1(name:String ,age:Int)
  11.  
  12. class DTCoder(val name:String ,val salary:Int)
  13. object DTCoder{
  14. //复写了其apply和unapply方法
  15. def apply(name:String,salary:Int)={
  16. println("DTCoder apply method invoked!!!")
  17. new DTCoder(name,salary)
  18. }
  19. // 方法1 (可使一个字符串转换成一个对象)
  20. // def unapply(information:String)={
  21. // //根据空格区分参数
  22. // println("DTCoder unapply method invoked!!!")
  23. // Some((information.substring(0 , information.indexOf(" ")),information.substring(information.indexOf(" ")+1)))
  24. // }
  25. //方法二
  26. def unapply(information:DTCoder)={
  27. //根据空格区分参数
  28. println("DTCoder unapply method invoked!!!")
  29. Some((information.name,information.salary))
  30. }
  31. }
  32.  
  33. object HelloExtractor {
  34. def main(args: Array[String]): Unit = {
  35. val person=Person1("Spark",12)//调用apply的工厂构造方法,构造出类的实例
  36. //= val person =Person1.apply("Spark",12)
  37. val Person1(name,age)=person//调用Person1的unapply的方法把person实例中的name和age提取出来
  38. println(person.name+" : "+person.age)//实现了name和age的赋值。
  39.  
  40. person match{ //val Person1(name,age)=person=match这个过程
  41. case Person1(name,age)=>println(name+" : "+age)
  42. }
  43. //针对unapply方法一
  44. //val DTCoder(dtname,salary) = "Spark 16000000"
  45.  
  46. //针对unapply方法二
  47. val coder = DTCoder("Spark",2999999)
  48. val DTCoder(dtname,salary)=coder
  49. }
  50. }

类的伴生对象:(高)

添加类的内容:

  1. class Marker ( color:String)
  2. class Marker (val color:String)
  3. class Marker (var color:String)
 

这两种申明是有差的,第二种和第三种申明都可以通过Marker的对象+"."直接调用(相当于这个属性是静态的),而第一种申明不行

  1. class Marker private (val color:String) {
  2.  
  3. println("创建" + this)
  4.  
  5. override def toString(): String = "颜色标记:"+ color
  6.  
  7. }

private写在类名和参数中间表示对主构造函数的私有化,这时是不能new出对象的(除非有伴生对象object或者有重构this构造函数)

  1. def main(args: Array[String]) {
  2. new Marker("black")//报错
  3. }
第一种解决方案:
添加object后,同时要有apply方法,否则还是报错(伴生对象是不带参数的,但是apply方法需要与原类相同的参数)
由于有apply方法的存在,创建新对象时,不需要用new关键字,
用object初始化时,他会直接初始化object中存在的所有变量。
  1. object zcb01 {
  2. def main(args: Array[String]) {
  3. Marker("white") //直接对象名进行初始化
  4. }
  5.  
  6. }
  7. class Marker (val color:String) {
  8.  
  9. println("创建" + this)
  10.  
  11. override def toString(): String = "颜色标记:"+ color
  12.  
  13. }
  14.  
  15. object Marker{
  16.  
  17. private val markers: Map[String, Marker] = Map(
  18. "red" -> new Marker("red"),
  19. "blue" -> new Marker("blue"),
  20. "green" -> new Marker("green")
  21. )
  22. private val m = Set(new Marker("black"))
  23. def apply(color:String) = {
  24. if(markers.contains(color)) markers(color) else null
  25. println("我输入的颜色:"+color)
  26. }
  27.  
  28. }

结果:(先将object中的元素初始化,然后再调用apply方法初始化当前对象)

创建颜色标记:red
创建颜色标记:blue
创建颜色标记:green
创建颜色标记:black
我输入的颜色:white

第二种解决方案:
重构构造器(创建对象时必须用new,因为object(apply方法)不支持除主构造以外的任何重载构造方式)
  1. object zcb01 {
  2. def main(args: Array[String]) {
  3. new Marker("white",4)
  4. }
  5.  
  6. }
  7. class Marker private (val color:String) {//主构造的形式与类名后面的形式相同
  8.  
  9. println("创建" + this)
  10. var a=1;
  11.  
  12. def this(color:String,a:Int){
  13. this(color)//必须先调用主构造器
  14. this.a=a;
  15. }
  16.  
  17. override def toString(): String = "颜色标记:"+ color
  18.  
  19. }

Scala学习——类,继承,接口(中)的更多相关文章

  1. Scala的类继承

    Scala的类继承 extend Scala扩展类的方式和java一样使用extends关键字 class Employee extends Person { } 与java一样,可以在定义的子类重写 ...

  2. Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用

    以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...

  3. Kotlin学习快速入门(3)——类 继承 接口

    类 参考链接 类定义格式 使用class关键字定义,格式如下: class T{ //属性 //构造函数 //函数 //内部类 } Java Bean类 java bean类 //java bean类 ...

  4. Scala学习八——继承

    一.本章要点 extends,final关键字和Java一样 重写方法时必须使用override 只有主构造器可以调用超类的构造器 可以重写字段 二.扩展类 Scala扩展类和Java一样(使用ext ...

  5. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...

  6. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  7. 【深入理解JVM】:Java类继承关系中的初始化顺序

    尝试着仔细阅读thinking in java 看到一篇很好的文章http://blog.csdn.net/u011080472/article/details/51330114

  8. Programming In Scala笔记-第十一章、Scala中的类继承关系

    本章主要从整体层面了解Scala中的类层级关系. 一.Scala的类层级 在Java中Object类是所有类的最终父类,其他所有类都直接或间接的继承了Object类.在Scala中所有类的最终父类为A ...

  9. iOS学习——iOS 整体框架及类继承框架图

    整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...

随机推荐

  1. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

  2. linux支持的machine-types

    在内核文件中arch/arm/tools/mach-types定义目前内核支持的板卡.芯片等: ##machine_is_xxx  CONFIG_xxxx  MACH_TYPE_xxx  number ...

  3. JQuery 获取URL中传递的参数

    该方法基于JQuery,然后给方法传递URL中的参数名,返回参数值 (function($){    $.getUrlParam = function(name){        var reg = ...

  4. tableView的cell显示不全的问题

    如果是最上面的cell没有显示完整 1.重新设置tableview的frame: 例如你的搜索框高度为50,那么设置self.tableview.frame= CGRectMake(0,50,self ...

  5. rabbitmq 安装-单点

    centos6.5  rabbitmq搭建 环境:centos6.5 192.168.9.41   安装rabbitmq需要先安装erlang.rabbitmq3.6版本需要erlang R16B03 ...

  6. API自动化测试利器——Postman

    自从开始做API开发之后,我就在寻找合适的API测试工具.一开始不是很想用Chrome扩展,用的WizTools的工具,后来试过一次Postman之后就停不下来了,还买了付费的Jetpacks.推出T ...

  7. 【BZOJ4399】魔法少女LJJ 线段树合并

    [BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...

  8. mongo数据库中一条记录中某个属性是数组情形时 数据结构的定义

    package entity; import java.util.Date; import com.mongodb.BasicDBList;import com.mongodb.DBObject; p ...

  9. Brotli

    https://engineering.linkedin.com/blog/2017/05/boosting-site-speed-using-brotli-compression?utm_sourc ...

  10. LightOJ - 1284 Lights inside 3D Grid —— 期望

    题目链接:https://vjudge.net/problem/LightOJ-1284 1284 - Lights inside 3D Grid    PDF (English) Statistic ...