Scala快速入门(三)——类与对象

一、类

这边类的模板如下,和Java很像

object a {
def main(args: Array[String]): Unit = {
val person=new Person
println(person.name+" "+person.age)
}
}
class Person{
var name:String = "steve yu"
var age = 10
}

遇到不确定的成员属性,最好不要赋值null,可赋值一个下划线,需要标明类型。下划线Int型代表0,Double代表0.0,boolean代表false,对象代表null,这样解决所有问题。

改进后:

class Person{
var name:String = _
var age:Int = _
}

二、创建对象和方法

1.对象的创建

我们可以加括号,也可以不加
val p=new Person
val p=new Person()
这两种都可以,用var还是val,官方推荐使用val

2.方法

和函数的创建一模一样

3.构造器

  def this(name:String,age:Int){
this
this.name=name
this.age=age
}

4.主构造器,3上的构造器并非主构造器,class后面的Person是主构造器,直接加括号,跟参数,即可写一个构造函数

class Person(){
var name:String = _
var age:Int = _
def this(name:String,age:Int){
this
this.name=name
this.age=age
}
}

5.构造器的私有

  • 主构造器的私有化
class Person private(){}
  • 其他构造器的私有化
  private def this(name:String,age:Int){
this
this.name=name
this.age=age
}
  • 构造器的高级运用(inname使用val修饰,那么inname就是一个只读变量)
class Person (val inname:String){
var name=inname
}

三、包

1.相同名字class进行分包处理

object Test {
def main(args: Array[String]): Unit = {
val tiger1=new com.littlepage.scalapackage.steve.Tiger
val tiger2=new com.littlepage.scalapackage.yu.Tiger
}
}

2.scala包可以任意改变package,并且,在package改变后,能够删除之前编译的内容并且重新编译

3.包的引用,首先引用本类,如果使用一样名字的类,需要把名字写全

例子:

val a=new com.littlepage.Tiger

4.包对象

为什么需要包对象。在包中不定义类,直接写方法,就会报错,所以,我们需要一个包对象技术

package object people{
//定义一个包对象
}

5.使用包对象进行调用函数

object Tiger {
def main(args: Array[String]): Unit = {
A.print_a
}
} package object A{
def print_a: Unit ={
println("a")
}
}

如果你的这个伴生类在A的package里面,可以直接进行调用

package A{
object Tiger {
def main(args: Array[String]): Unit = {
print_a
}
}
}

我们反编译这段代码,发现这个package实际是一个final的class,中间有个静态的MODULE$对象

包对象注意点:
1.每个包只有一个包对象
2.包对象的名称需要和包名保持一致

四、访问修饰符

1.属性为默认时,底层看是private的,使用效果是public的

2.方法为默认,默认是public的

3.private为私有权限,只在类内部和伴生对象中可用

4.protected为受保护的,保护权限只能供子类访问,同包无法访问

5.scala中没有public关键字,不能用public 进行修饰属性和方法

注意点:
scala中,我们import一个包中所有的内容应该使用下划线,而不是使用*

作业布置

1.编写一个Time类,加入只读属性hours和minutes,检查某一个时刻是否早于另外一个时刻的方法,before(other:Time):Boolean。Time对象应该以new Time(hrs,min)的方式构建

class Time(val hrs:Int,val min:Int) {
val hours:Int=hrs
val minutes:Int=min def before(other:Time):Boolean={
if(hours!=other.hours) hours<other.hours
else minutes<other.minutes
}
}

2.编写一段程序,将Java中的HashMap中的所有元素拷贝到Scala的HashMap,用引入语句重命名这两个类。

object Test {
import java.util.{HashMap=>JavaHashMap}
import collection.mutable.{HashMap=>ScalaHashMap}
def main(args: Array[String]): Unit = {
val jm=new JavaHashMap[Int,String]
jm.put(1,"小舞")
jm.put(2,"团团")
jm.put(2,"怪兽")
jm.put(4,"S.X")
val sm=new ScalaHashMap[Int,String]()
for(k<-jm.keySet().toArray()){
sm.put(k.asInstanceOf[Int],jm.get(k))
}
println(sm.mkString(" "))
}
}

Scal(三)——类与对象的更多相关文章

  1. IOS基础之 (三) 类的声明和对象的创建

    一 OC类的声明和实现语法 1.接口的声明 @interface NewClassName: ParentClassName { 实例变量 ... } 方法的声明 ... @end //...表示省略 ...

  2. java总结第三次//类和对象2、3

    四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...

  3. python-面向对象(三)——类的特殊成员

    类的特殊成员 1. __doc__     表示类的描述信息 class Foo: """ 描述类信息,这是用于看片的神奇 """ def ...

  4. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  5. PHP7语法知识(三):时间与日期、表单、类与对象、正则表达式、错误异常处理、图像处理

    时间与日期 一.设置时区 1.在配置文件中设置: 2.通过data_default_timezone_set函数在文件中设置: 二.获取当前时间 三.常用时间处理方法 1.格式化时间显示: 2.计算时 ...

  6. Kotlin基础(三)类、对象和接口

    类.对象和接口 一.定义类的继承结构 一)Kotlin中的接口 Kotlin的接口与Java8中相似,它们可以包含抽象方法的定义以及非抽象方法的实现,但它们不能包含任何状态. interface Cl ...

  7. 【C++/实验三】类和对象

    1.定义一个矩形类,有长,宽两个属性,有成员函数计算矩形的面积. 在该矩形类中,我做了5个主要的测试. 构造函数带默认值参数,利用默认值参数计算矩形面积:rectangle(double x=2.0, ...

  8. PHP 类与对象 全解析(三)

    目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 13.魔术方法 定义:PHP把所有以__(两个下划线)开头的类方法当成魔术方法     __ ...

  9. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

随机推荐

  1. MySQL常用维护命令和操作

    MySQL数据库安装后,除了包括MySQL服务器进程管理外,还提供了大量工具用于管理和维护MySQL服务器的其它工作.下面PHP程序员雷雪松介绍的这些命令都是在MySQL交互界面以外的命令行中执行的. ...

  2. Django-Form组件-forms.Form

    forms.Form ​ 在之前的示例HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时很多时候都需要对用户的输入做校验,比如校验用 ...

  3. mybatis resultMap 子元素

    resultMap constructor - 类在实例化时,用来注入结果到构造方法中 idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能 arg - 注入到构造方法的一个普通结果 ...

  4. 深入理解C语言-深入理解指针

    关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏.其实指针并不复杂,学习指针,要正确的理解指针. 指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 指针就是告诉编译 ...

  5. nRF5 SDK Bootloader and DFU moudles(3)

    DFU控制点特性用于控制DFU过程的状态. 通过写入该特征来请求所有DFU程序. 标记过程结束的响应将作为通知收到. BLE传输 Transfer of an init packet DFU控制器首先 ...

  6. ######【Python】【基础知识】Python的介绍 ######

    Python 是一种面向对象.解释型计算机程序设计语言. Python是什么? Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言 ...

  7. 使用SecureCRT连接虚拟机中Linux系统 和 虚拟机网络配置

    使用SecureCRT连接步骤:1.首先打开虚拟机,点击左上角的编辑,再点击虚拟网络编辑器(已经进行虚拟网络编辑的忽略此步骤,直接进行第二步) 点击VMnet8网络,点击更改设置,此步骤需要管理员权限 ...

  8. java持续添加内容至本地文件

    package com.lcc.commons; import com.lcc.commons.dto.FileLogDTO; import java.io.*; import java.util.A ...

  9. 【Havel 定理】Degree Sequence of Graph G

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2454 [别人博客粘贴过来的] 博客地址:https://www.cnblogs.com/debug ...

  10. k8s之statefulSet-有状态应用副本集控制器

    1.概述 无状态应用更关注群体,任何一个成员都可以被取代,有状态应用关注的是个体.用deployment控制器管理的nginx.myapp等都属于无状态应用,像mysql.redis.zookeepe ...