当前位置: 首页 > news >正文

Scala语言(三)

面向对象基础

scala类中可以传参,这是与java不同的地方

(object不能传参)

传参一定要指明类型,类中的属性默认有getter()和setter()

package com.scala

class Person(val xname:String, xage:Int){
  val name = xname
  var age = xage
}
object scala_obj {
  def main(args: Array[String]): Unit = {
    val p = new Person("zhangsan",20)
    println(p.name)
    p.age = 30
    println(p.age)
    println(p.xname)
  }
}

类中传参,如果定义的是val,可以在外面直接调用

 

方法的定义

package com.scala

class Person(val xname:String, xage:Int){
  val name = xname
  var age = xage

  def sayName() = {
    println("hello world..." + scala_obj.name)
  }
}

object scala_obj {
  val name = "wangwu"
  def main(args: Array[String]): Unit = {
    val p = new Person("zhangsan",20)
    p.sayName()
  }
}

从这也可以看出来object中定义的都是静态方法,可以直接类名.方法名调用的

 

类中重写构造

类中重写构造时,构造中第一行必须先调用默认的构造

      def this()

package com.scala

class Person(val xname:String, xage:Int){
  val name = xname
  var age = xage
  var gender = 'M'

  def this(yname:String, yage:Int, ygender:Char){
    this(yname,yage)
    this.gender = ygender
  }
  def sayName() = {
    println("hello world..." + scala_obj.name)
  }
}

object scala_obj {
  val name = "wangwu"
  def main(args: Array[String]): Unit = {
    val p = new Person("zhangsan",20)
    val p1 = new Person("diaochan",18,'F')
    println(p1.gender)
  }
}

 

scala中当new class时,类中除了方法不执行(构造方法执行),其他都执行

package com.scala

class Person(val xname:String, xage:Int){
  val name = xname
  var age = xage
  var gender = 'M'

  println("**************Person Class*************")

  def this(yname:String, yage:Int, ygender:Char){
    this(yname,yage)
    this.gender = ygender
  }
  def sayName() = {
    println("hello world..." + scala_obj.name)
  }
  println("======Person Class======")
}

object scala_obj {
  val name = "wangwu"
  def main(args: Array[String]): Unit = {
    val p1 = new Person("diaochan",18,'F')
  }
}

会执行类中的println语句

scala中可以这样,java写println这样的语句必须写在方法里面

 

object是不可以传参的,除非使用apply方法

object scala_obj {

  def apply(i:Int) = {
    println("Score is " + i)
  }

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

 

在同一个scala文件中,class名称和object名称一样时,这个类叫做这个对象的伴生类,这个对象叫做这个类的伴生对象,他们之间可以互相访问私有变量

 

 

 

Scala和Java一样,建议不要直接去暴露public字段,设置为私有,也提供了getter和setter方法,帮你读取和写入变量值

但getter和setter的实现和Java有点不太一样

这里的value_=是一个方法名称,可不是一个赋值的概念

没有参数的方法在定义的时候是可以把圆括号省略掉的

如果定义的时候把括号省略,那么后面调用的时候一定也不能加括号(如果定义的时候又括号,那么调用的时候可省略也可以带着)

并且这里的圆括号也可以用大括号{}来代替

如果整个方法体只有一条语句,也可以把大括号省略掉

当方法的返回结果类型可以从表达式推断出来的时候,可以省略结果的类型,不用再改方法名后面写个冒号属于什么类型

 

构造器

      Scala构造器和Java的很大区别就是可以在类的名称后面的圆括号里面直接给出一些参数,而且如果构造器里面这个参数加了val或var这个关键字去修饰的话,系统会自动把它变成自己内部的成员字段,并且给它提供getter和setter方法。如果没有加val或var,则它不会变成一个内部字段,只是简单地起到往里传参的作用

运行

 

对象(单例对象)

这些都是Scala特有的

 

所有定义到单例对象当中的字段、方法都是静态的

 

互相能访问对方内部的成员变量和成员方法

 

apply方法

声明数组的时候Java和Scala的区别

实际上就称为工厂,会不断生成新的类的对象

那么Scala为什么不像Java那样new一个对象然后生成实例呢

是为了保持对象和函数的一致性

Scala融合面向对象和函数式编程两种风格

括号调用是函数调用

点方法是面向对象方法

同理,Scala对象也可以被看做是函数

如果类中已经定义了apply方法的话,就可以转换成函数式的调用风格

函数式方法可以在后台自动给你转成对象方法,因为有了apply调用

 

update和unapply方法

 

 

相关文章:

  • Python——virtualenv/virtualenvwrapper
  • Python多进程(multiprocessing)(mp)(一) —— 进程的创建 join()方法
  • Python多进程(multiprocessing)(mp)(二) —— 创建多进程 继承process类 进程池(Pool)
  • Python多进程(multiprocessing)(mp)(三) —— 进程间通信 Queue队列(Manager)
  • Python多线程(二): 线程同步 生产者消费者模式 ThreadLocal线程局部变量
  • 爬虫url去重策略
  • 爬虫中的深搜和广搜
  • Objective-C
  • MyOS(四):让内核突破512字节的限制
  • Go语言实现并发(协程)
  • 汇编语言相关知识
  • 面向对象的意义
  • 文本大数据挖掘项目(Go语言)
  • Python网络编程
  • CUDA与cuDNN
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ESLint简单操作
  • js面向对象
  • Kibana配置logstash,报表一体化
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Netty源码解析1-Buffer
  • nodejs:开发并发布一个nodejs包
  • python3 使用 asyncio 代替线程
  • Service Worker
  • spring security oauth2 password授权模式
  • 如何学习JavaEE,项目又该如何做?
  • 正则表达式小结
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • #stm32驱动外设模块总结w5500模块
  • (0)Nginx 功能特性
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .net web项目 调用webService
  • .net 设置默认首页
  • .Net中wcf服务生成及调用
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [ANT] 项目中应用ANT
  • [APUE]进程关系(下)
  • [BUUCTF]-Reverse:reverse3解析
  • [bzoj2957]楼房重建
  • [CF494C]Helping People
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [IE编程] 了解Urlmon.dll和Wininet.dll
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • [LeetCode]: 145: Binary Tree Postorder Traversal
  • [node] Node.js 缓冲区Buffer
  • [poj2891]Strange Way to Express Integers(扩展中国剩余定理)
  • [Servlet 3]会话管理、进阶API、监听过滤器
  • [Spark SQL]Spark SQL读取Kudu,写入Hive