Scala05:Scala面向对象

一、Scala面向对象编程

在这里我们主要学习Scala中的类、对象和接口

注意:
Scala中类和java中的类基本是类似的
Scala中的对象时需要定义的,而java中的对象是通过class new出来的
Scala中的接口是trait,java中的接口是interface

二、类-class

首先看一下类
Scala中定义类和Java一样,都是使用 class 关键字

和Java一样,使用new关键字创建对象

那下面来看一个具体案例
定义Person类,创建对象并调用其方法
在这里插入图片描述

class Person{
    var name = "scala"
    def sayHello(){
        println("Hello,"+name)
    }
    def getName= name
}

注意:如果在定义方法的时候指定了(),那么在调用的时候()可写可不写,如果在定义方法的时候没指定(),则调用方法时肯定不能带()

在这里插入图片描述

1、constructor

类创建好了,下面我们来看一下类中的构造函数,

Scala类中的构造函数可以分为主构造函数和辅助构造函数
这两种构造函数有什么区别呢?
主constructor:类似Java的默认构造函数 this()
辅助constructor:类似Java的重载构造函数 this(name,age)

2、主constructor

那先来看一下主构造函数
Scala的主constructor是与类名放在一起的,与Java不同,Java中的构造函数是写在类内部的

注意:在类中,没有定义在任何方法或者是代码块之中的代码就是主constructor的代码

上代码:
先定义一个Student类
在这里插入图片描述

class Student(val name:String,val age:Int){
    println("your name is " + name + ", your age is " + age)
}

创建对象
在这里插入图片描述
在创建对象的时候,类中的println语句执行了,说明这个语句属于主构造函数中的代码

主constructor中还可以通过使用默认参数,来给参数设置默认值
在这里插入图片描述

class Student(val name:String = "jack",val age:Int = 20){
    println("your name is " + name + ", your age is " + age)
}

创建对象

在这里插入图片描述

3、辅助constructor

Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载
辅助constructor之间可以互相调用,但是第一行必须调用主constructor

来看一个案例:
给学生指定姓名和年龄信息
在这里插入图片描述

class Student {
  var name = "jack"
  var age = 10
  def this(name: String) {
    this()
    this.name = name
  }
  def this(name: String, age: Int) {
    this(name)
    this.age = age
  }
}

执行
在这里插入图片描述

三、对象-object

前面我们学习的scala中的class和java中的class是类似的,下面来看一个java中没有的内容,叫Object
那大家可能有疑问了,Java中也有object,通过class就可以创建object
但是注意了,在scala中,我们可以直接定义一个object,就像定义class一样。

object:相当于class的单个实例,通常在里面放一些静态的field或者method
object不能定义带参数的constructor,只有空参的constructor
第一次调用object的方法时,会执行object的constructor,也就是执行object内部不在任何方法中的代码,因为它只有空参的构造函数
但是注意,object的constructor的代码只会在他第一次被调用时执行一次,以后再次调用就不会再执行了

object通常用于作为单例模式的实现,或者放class的一些静态成员,比如工具方法

object可以直接使用,不能new

创建一个object,使用object关键字
在这里插入图片描述

object Person {
  var age = 1
  println("this Person object!")
  def getAge  = age 
}

执行,直接通过Object的名称调用属性或者方法即可,类似于Java中的静态类。
在这里插入图片描述

1、伴生对象

前面学习了class和object,那下面再来看一个特殊的概念,伴生对象。
如果有一个class,还有一个与class同名的object,那么就称这个object是class的 伴生对象 ,class是object的 伴生类。

注意:伴生类和伴生对象必须存放在一个.scala文件之中
伴生类和伴生对象最大特点在于可以互相访问private field

创建一个Person object和Person class
在这里插入图片描述

object Person {
  private val fdNum= 1
  def getFdNum = fdNum
}
class Person(val name: String, val age: Int) {
  def sayHello = println("Hi, " + name + ",you are " + age + " years old!" + ", and you  have " + Person.fdNum+ " friend.")
}

执行

在这里插入图片描述

2、apply

apply是object中非常重要的一个特殊方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能
在创建对象的时候,就不需要使用new Class的方式,而是使用Class()的方式,隐式调用伴生对象的apply方法,这样会让对象创建更加简洁

例如:Array的伴生对象的apply方法就实现了接收可变数量的参数,以及会创建一个Array对象
val a = Array(1, 2, 3, 4, 5)

看一下文档

在这里插入图片描述
查看Array的源码
在这里插入图片描述
从Array object的源码中可以看出来,它里面就是在apply方法内部使用new Array创建的对象

下面我们来自己定义一个伴生类和伴生对象
在这里插入图片描述

class Person(val name: String){
  println("my name is,"+name)
}

object Person {
  def apply(name: String) = {
    println("apply exec...")
    new Person(name)
  }
}

执行
在这里插入图片描述

注意:在这里new Person(“zhang”) 等于 Person(“zhang”),都是获取Person的对象
只不过Person(“zhang”)是用的object中apply方法
而new Person(“zhang”)是直接基于class创建的

这两种方式肯定Person(“zhang”)这种方式使用起来更加方便简洁

3、main方法

接下来看一下scala中的main方法
和Java一样,在Scala中如果要运行一个应用程序,必须有一个main方法,作为入口

Scala中的main方法必须定义在object中,格式为def main(args: Array[String])

这就需要在编辑器中操作了,我们可以使用eclipse或者idea,但是eclipse对scala的支持不太好,所以建议使用idea

首先确认一下idea中是否集成了scala语言插件
打开idea,点击configure–>plugins

在这里插入图片描述
确认scala的插件是否已经安装

在这里插入图片描述
接着创建maven项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击开启自动引入依赖

在这里插入图片描述
到这还没完,因为此时我们是无法创建scala代码的,这个项目中也没有集成scala的sdk,只有java的

在这里插入图片描述
接下来就需要给这个项目添加scala的sdk了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加成功以后是这样的

在这里插入图片描述
此时查看项目的依赖,发现scala的sdk已经添加进来了

在这里插入图片描述
最终点击ok即可
在这里插入图片描述
以后再创建想要创建scala的maven项目,只需要进入到这个界面确认项目中是否有scala的依赖,没有的话直接点击右边的加号按钮添加即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好,idea的scala开发环境配置好了,但是我一般还是喜欢再增加一些配置
目前项目的src目录下有一个java目录,这个目录表示是放java代码的,当然了你在里面写scala代码肯定是没有问题的。
只是针对我这种稍微有点强迫症的用起来就有点别扭了
在实际工作中可能我们一个项目既需要使用到java代码,也需要使用到scala代码,所以最好还是建议把java代码和scala代码分开存放,这样比较清晰

所以我们需要在这里比葫芦画瓢,增加一个scala目录

在这里插入图片描述
在弹出的框中输入scala
最后就可以看到如下效果了
在这里插入图片描述

但是注意了,这样创建的scala目录是有问题的,你有没有发现这个目录的颜色和java目录的颜色都不一样
因为你在这直接创建的scala目录是一个普通的目录,而java那个目录是一个source根目录
所以我们也需要把scala目录变为source根目录
这样操作

在这里插入图片描述
这样操作之后,就发现scala的目录颜色就正常了

在这里插入图片描述
好,那下面就可以正式开始写代码了,scala相关的代码就放到scala目录中

现在scala目录下创建包:com.imooc.demo
然后创建一个scala的object
先选中Scala Class
在这里插入图片描述

在这里插入图片描述

按回车即可创建成功

在mainDemo这个scala object中定义main函数
代码如下
在这里插入图片描述

package com.imooc.demo

/**
 * 
 */
object mainDemo {

  def main(args: Array[String]): Unit = {
    println("hello scala!")
  }

}

执行代码,右键run即可
输出结果如下
在这里插入图片描述

hello scala!

这就是Scala中main方法的用法,注意:main方法只能定义在object中,不能定义在class中。

四、接口-trait

接下来看一个scala中的接口,这个接口也是比较特殊的

Scala中的接口称为trait,trait类似于Java中的interface
在triat中可以定义抽象方法

类可以使用extends 关键字继承trait,无论继承类还是trait统一都是使用extends这个关键字
类继承trait后,必须实现trait中的抽象方法,实现时不需要使用override关键字

scala不支持对类进行多继承,但是支持对trait进行多重继承,使用with关键字即可

下面我们就来看一个接口多继承的案例
在这里插入图片描述

/**
 * 
 */
object PersonDemo {
  def main(args: Array[String]): Unit = {
    val p1 = new Person("tom")
    val p2 = new Person("jack")
    p1.sayHello(p2.name)
    p1.makeFriends(p2)
  }
}

trait HelloTrait { def sayHello(name: String)}
trait MakeFriendsTrait { def makeFriends(p: Person)}
class Person(val name: String) extends HelloTrait with MakeFriendsTrait {
  def sayHello(name: String) = println("Hello, " + name)
  def makeFriends(p: Person) = println("Hello, my name is " + name + ", your name is " + p.name)
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个有趣的人Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值