bigdata-31-Scala面向对象

简介: bigdata-31-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

}

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

scala> val p = new Person()

p: Person = Person@23b8d9f3

scala> p.sayHello()

Hello,scala

scala> p.sayHello

Hello,scala

scala> println(p.getName)

scala

scala> println(p.getName())

:10: error: not enough arguments for method apply: (index: Int)Char in class StringOps.

Unspecified value parameter index.

             println(p.getName())

constructor

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

Scala类中的构造函数可以分为主构造函数和辅助构造函数

这两种构造函数有什么区别呢?

主constructor:类似Java的默认构造函数 this()

辅助constructor:类似Java的重载构造函数 this(name,age)

主constructor

那先来看一下主构造函数

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

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

上代码:

先定义一个Student类

class Student(val name:String,val age:Int){

   println("your name is " + name + ", your age is " + age)

}

创建对象

scala> new Student("zs",19)

your name is zs, your age is 19

res8: Student = Student@3134153d

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

主constructor中还可以通过使用默认参数,来给参数设置默认值

class Student(val name:String = "jack",val age:Int = 20){

   println("your name is " + name + ", your age is " + age)

}

创建对象

scala> new Student()

your name is jack, your age is 20

res10: Student = Student@7ddd84b5

scala> new Student("tom",18)

your name is tom, your age is 18

res11: Student = Student@a09303

辅助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

}

}

执行

scala> val s = new Student("tom")

s: Student = Student@1a538ed8

scala> val s = new Student("mick",30)

s: Student = Student@319642db

对象-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中的静态类

scala> Person

this Person object!

res18: Person.type = Person$@73e776b7

scala> Person.age

res19: Int = 1

scala> Person.getAge

res20: Int = 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.")

}

执行

scala> new Person("tom",20).sayHello

Hi, tom,you are 20 years old!, and you  have 1 friend.

scala> Person.fdNum

:9: error: value fdNum is not a member of object Person

             Person.fdNum

                    ^

scala> Person.getFdNum

res26: Int = 1

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创建的对象

main方法

接下来看一下scala中的main方法

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

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

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

首先确认一下idea中是否集成了scala语言插件

打开idea,点击configure-->plugins

创建Maven项目并引入依赖

添加sdk

好,idea的scala开发环境配置好了,但是我一般还是喜欢再增加一些配置

目前项目的src目录下有一个java目录,这个目录表示是放java代码的,当然了你在里面写scala代码肯定是没有问题的。

只是针对我这种稍微有点强迫症的用起来就有点别扭了

在实际工作中可能我们一个项目既需要使用到java代码,也需要使用到scala代码,所以最好还是建议把java代码和scala代码分开存放,这样比较清晰

接口-trait

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

Scala中的接口称为trait,trait类似于Java中的interface

在triat中可以定义抽象方法

类可以使用extends 关键字继承trait,无论继承类还是trait统一都是使用extends这个关键字

类继承trait后,必须实现trait中的抽象方法,实现时不需要使用override关键字

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

/**

* Created by xuwei

*/

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)

}

目录
相关文章
|
Web App开发 JavaScript IDE
uni-app开发之创建一个app项目
uni-app开发之创建一个app项目
302 0
|
11月前
|
机器学习/深度学习 搜索推荐 算法
学生党狂喜,物理图表动起来!受力分析、光学、电路图等全自动交互
“Augmented Physics”是由卡尔加里大学和香港城市大学研究人员开发的创新工具,利用机器学习将静态物理图表转化为交互式模拟,帮助学生通过操作亲身体验物理现象的变化过程,增强理解、提高兴趣并实现个性化学习。该工具在课堂教学、自主学习和虚拟实验中具有广泛应用前景。论文链接:https://arxiv.org/pdf/2405.18614。
287 40
|
机器学习/深度学习 人工智能 自然语言处理
探索未来编程:Python在人工智能领域的深度应用与前景###
本文将深入探讨Python语言在人工智能(AI)领域的广泛应用,从基础原理到前沿实践,揭示其如何成为推动AI技术创新的关键力量。通过分析Python的简洁性、灵活性以及丰富的库支持,展现其在机器学习、深度学习、自然语言处理等子领域的卓越贡献,并展望Python在未来AI发展中的核心地位与潜在变革。 ###
|
网络安全 文件存储 虚拟化
【阿里云镜像】使用VM虚拟机安装OpenWRT并更换阿里云镜像源
【阿里云镜像】使用VM虚拟机安装OpenWRT并更换阿里云镜像源
2356 0
【阿里云镜像】使用VM虚拟机安装OpenWRT并更换阿里云镜像源
|
存储 人工智能 编解码
在Data-Driven时代下,如何打造下一代智能数据体系?
本文源自2024外滩大会“Data+AI”论坛,由蚂蚁集团数据平台与服务部负责人骆骥演讲整理。文章回顾了数据技术发展历程,指出生成式AI正推动数据技术从成本效率中心向价值中心转变。
|
Android开发 iOS开发 UED
安卓与iOS的较量:谁才是智能手机市场的王者?
本文将深入探讨安卓和iOS两大智能手机操作系统之间的竞争关系,分析它们各自的优势和劣势。通过对比两者在市场份额、用户体验、应用生态等方面的表现,我们将揭示出谁才是真正的市场领导者。无论你是安卓粉丝还是iOS忠实用户,这篇文章都将为你提供一些有趣的观点和见解。
|
人工智能 算法 前端开发
打破传统叙事逻辑,构建基于原子化任务的人机交互
在复杂中后台设计中,为解决配置变更影响多场景问题,提出结合正向和逆向信息架构,采用原子化任务,动态组合任务,降低用户和开发成本,优化体验并改变已有的产品迭代和人机交互模式。未来可能发展为AI自动根据业务规则和用户行为生成最佳方案。
|
Web App开发 前端开发 JavaScript
JavaScript Web Full Stack 全栈开发者路线及内容推荐
本文详细介绍了一条全面的JavaScript全栈开发者学习路径,涵盖基础知识、前端和后端开发、数据库与API、MERN Stack与React Native、工程化与部署、安全与测试、未来趋势等方面。推荐了HTML5、CSS3、JavaScript(ES6+)、Node.js、React.js、Vue.js、Svelte、Tailwind CSS、Web Components等关键技术,并提供了丰富的书籍、博主和在线资源。此外,还回顾了JavaScript的历史,并推荐了多个活跃的社区和平台,帮助开发者紧跟技术前沿。
|
开发框架 缓存 .NET
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
141 0
|
前端开发 JavaScript UED
window.print() 前端实现网页打印详解
window.print() 前端实现网页打印详解
766 0

热门文章

最新文章