scala编程语言

一、练习

object Person {

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

//编写函数求1+2+3+....+n

println(sum(10))

//判断一个数是否为水仙花数

isShuiXianHuaShu(123)

}

def sum(num :Int):Int= {

if (num == 1) {

1

} else {

num + sum(num - 1)

}

}

def isShuiXianHuaShu(num: Int): Unit = {

var a = num / 100

var b = num % 100 / 10

var c = num % 10

if (a * a * a + b * b * b + c * c * c == num && num >= 100 && num < 1000) {

println("shi")

} else {

println("bushi")

}

}

}

二、 1 Scala 包

1)基本语法

package 包名

2)Scala 包的三大作用(和 Java 一样)

(1)区分相同名字的类

(2)当类很多时,可以很好的管理类

(3)控制访问范围

1.1包的命名

1)命名规则

只能包含数字、字母、下划线、小圆点.,但不能用数字开头,也不要使用关键字。

2)案例实操

demo.class.exec1 //错误,因为 class 关键字

demo.12a //错误,数字开头

3)命名规范

一般是小写字母+小圆点

com.公司名.项目名.业务模块名

4)案例实操

com.zpark.oa.model com.zpark.oa.controller

com.sohu.bank.order

1.2包说明(包语句)

com.zpapackage com{ package zpark{

package scala{

}

}

}

第二种风格有以下特点:

(1)一个源文件中可以声明多个 package

(2)子包中的类可以直接访问父包中的内容,而无需导包

2)案例实操

package com {

import com.zpark.Inner //父包访问子包需要导包object Outer {

val out: String = "out"

def main(args: Array[String]): Unit = { println(Inner.in)

}

}

package zpark { object Inner {

val in: String = "in"

def main(args: Array[String]): Unit = { println(Outer.out) //子包访问父包无需导包

}

}

}

}

package other {

}

}

1.3包对象

在 Scala 中可以为每个包定义一个同名的包对象,定义在包对象中的成员,作为其对应包下所有 class 和 object 的共享变量,可以被直接访问。

1)定义

package object com{

val shareValue="share" def shareMethod()={}

}

1)说明

(1)若使用 Java 的包管理风格,则包对象一般定义在其对应包下的 package.scala

文件中,包对象名与包名保持一致。

package com {

object Outer {

val out: String = "out"

def main(args: Array[String]): Unit = { println(name)

}

}

}

package object com {

val name: String = "com"

}

1.4导包说明

1)和 Java 一样,可以在顶部使用 import 导入,在这个文件中的所有类都可以使用。

2)局部导入:什么时候使用,什么时候导入。在其作用范围内都可以使用3)通配符导入:import java.util._

4)给类起名:import java.util.{ArrayList=>JL}

  1. 导入相同包的多个类:import java.util.{HashSet, ArrayList}

6)屏蔽类:import java.util.{ArrayList =>,}

7)导入包的绝对路径:new root.java.util.HashMap

package java { package util {

class HashMap {

}

}

}

2 类和对象

类:可以看成一个模板对象:表示具体的事物

2.1定义类

1)回顾:Java 中的类

如果类是 public 的,则必须和文件名一致。一般,一个.java 有一个 public 类

注意:Scala 中没有 public,一个.scala 中可以写多个类。

1)基本语法

修饰符\] class 类名 { 类体 } 说明 (1)Scala 语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public) (2)一个Scala 源文件可以包含多个类 2)案例实操 package com.zpark.chapter06 //(1)Scala 语法中,类并不声明为 public,所有这些类都具有公有可见性(即默认就是 public) class Person { } //(2)一个 Scala 源文件可以包含多个类 class Teacher{ } ****2.2属性**** 属性是类的一个组成部分 1)基本语法 \[修饰符\] var\|val 属性名称 \[:类型\] = 属性值 注:Bean 属性(@BeanPropetry),可以自动生成规范的 setXxx/getXxx 方法 2)案例实操 package com.zpark.scala.test import scala.beans.BeanProperty class Person { var name: String = "bobo" //定义属性 var age: Int = _ // _表示给属性一个默认值 //Bean 属性(@BeanProperty) @BeanProperty var sex: String = "男" //val 修饰的属性不能赋默认值,必须显示指定 } object Person { def main(args: Array\[String\]): Unit = { var person = new Person() println(person.name) person.setSex(" 女 ") println(person.getSex) } } ![](https://i-blog.csdnimg.cn/direct/09c3615ae61849099cdb16ff699bfc70.png) ****2.3**** ****访问权限**** 1)说明 (1)Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。 (2)private 为私有权限,只在类的内部和伴生对象中可用。 (3)protected 为受保护权限,Scala 中受保护权限比 Java 中更严格,同类、子类可以访问,同包无法访问。 (4)private\[包名\]增加包访问权限,包名下的其他类也可以使用 6.2.3方法 1)基本语法 def 方法名(参数列表) \[:返回值类型\] = { 方法体 } 2)案例实操 class Person { def sum(n1:Int, n2:Int) : Int = { n1 + n2 } } object Person { def main(args: Array\[String\]): Unit = { val person = new Person() println(person.sum(10, 20)) } } ![](https://i-blog.csdnimg.cn/direct/fd805bb77ce84375b82e8447e6a97bd7.png) ****2.4创建对象**** 1)基本语法 val \| var 对象名 \[:类型\] = new 类型() 2)案例实操 (1)val 修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值。 (2)var 修饰对象,可以修改对象的引用和修改对象的属性值 (3)自动推导变量类型不能多态,所以多态需要显示声明 class Person { var name: String = "canglaoshi" } object Person { def main(args: Array\[String\]): Unit = { //val 修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值。 val person = new Person() person.name = "bobo" // person = new Person()// 错误的 println(person.name) } } ![](https://i-blog.csdnimg.cn/direct/3710bf90079045419464a12d36b69040.png) ****2.5构造器**** 和 Java 一样,Scala 构造对象也需要调用构造方法,并且可以有任意多个构造方法。 Scala 类的构造器包括:主构造器和辅助构造器 1)基本语法 class 类名(形参列表) { // 主构造器 // 类 体 def this(形参列表) { // 辅助构造器 } def this(形参列表) { //辅助构造器可以有多个... } } 2)案例实操 (1)如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略。 //(1)如果主构造器无参数,小括号可省略 //class Person (){ class Person { var name: String = _ var age: Int = _ def this(age: Int) { this() this.age = age println("辅助构造器") } def this(age: Int, name: String) { this(age) this.name = name } println("主构造器") } object Person { def main(args: Array\[String\]): Unit = { val person2 = new Person(18) } }![](https://i-blog.csdnimg.cn/direct/2af37f343d634242ab6d1f37ae687747.png) ![](https://img-home.csdnimg.cn/images/20230724024159.png) ****2.6构造器参数**** 1)说明 Scala 类的主构造器函数的形参包括三种类型:未用任何修饰、var 修饰、val 修饰 (1)未用任何修饰符修饰,这个参数就是一个局部变量 (2)var 修饰参数,作为类的成员属性使用,可以修改 (3)val 修饰参数,作为类只读属性使用,不能修改 2)案例实操 class Person(name: String, var age: Int, val sex: String) { } object Test { def main(args: Array\[String\]): Unit = { var person = new Person("bobo", 18, "男") // (1)未用任何修饰符修饰,这个参数就是一个局部变量 // printf(person.name) // (2)var 修饰参数,作为类的成员属性使用,可以修改 person.age = 19 println(person.age) // (3)val 修饰参数,作为类的只读属性使用,不能修改 // person.sex = "女" println(person.sex) } } ![](https://i-blog.csdnimg.cn/direct/7338500c7cfb43d7ad53c45bac5fffdb.png) ****3**** ****、**** ****封装**** 封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。Java 封装操作如下, (1)将属性进行私有化 (2)提供一个公共的 set 方法,用于对属性赋值 (3)提供一个公共的 get 方法,用于获取属性的值 6.4继承和多态 1)基本语法 class 子类名 extends 父类名 { 类 体 } (1)子类继承父类的属性和方法 (2)scala 是单继承 2)案例实操 (1)子类继承父类的属性和方法 继承的调用顺序:父类构造器-\>子类构造器 class Person(nameParam: String) { var name = nameParam var age: Int = _ def this(nameParam: String, ageParam: Int) { this(nameParam) this.age = ageParam println("父类辅助构造器") } println("父类主构造器") } class Emp(nameParam: String, ageParam: Int) extends Person(nameParam, ageParam) { var empNo: Int = _ def this(nameParam: String, ageParam: Int, empNoParam: Int) { this(nameParam, ageParam) this.empNo = empNoParam println("子类的辅助构造器") } println("子类主构造器") } object Test { def main(args: Array\[String\]): Unit = { new Emp("z3", 11,1001) } } ![](https://i-blog.csdnimg.cn/direct/f57ba8e20bf34be6b232522c3efb7bde.png) 1. 动态绑定 Scala 中属性和方法都是动态绑定,而Java 中只有方法为动态绑定。 案例实操(对比 Java 与 Scala 的重写) class Person { val name: String = "person" def hello(): Unit = { println("hello person") } } class Teacher extends Person { override val name: String = "teacher" override def hello(): Unit = { println("hello teacher") } } object Person { def main(args: Array\[String\]): Unit = { val teacher: Teacher = new Teacher() println(teacher.name) teacher.hello() val teacher1:Person = new Teacher println(teacher1.name) teacher1.hello() } } ![](https://i-blog.csdnimg.cn/direct/b36b9252b61d48f3b4d5e695ecf9bd7b.png) class Person { public String name = "person"; public void hello() { System.out.println("hello person"); } } class Teacher extends Person { public String name = "teacher"; @Override public void hello() { System.out.println("hello teacher"); } } public class TestDynamic { public static void main(String\[\] args) { Teacher teacher = new Teacher(); Person teacher1 = new Teacher(); System.out.println(teacher.name); teacher.hello(); System.out.println(teacher1.name); teacher1.hello(); } } 结果对比 |---|----------------------------------------------------------------------------| | | | | ![](https://i-blog.csdnimg.cn/direct/0e9a5125d7d14afe9bf56ddf518323b3.png) | |---|----------------------------------------------------------------------------| | | | | ![](https://i-blog.csdnimg.cn/direct/2c693c7d38464eceafd73a615e4087fc.png) |

相关推荐
小萌新上大分26 分钟前
SpringCloudGateWay
java·开发语言·后端·springcloud·springgateway·cloudalibaba·gateway网关
PacosonSWJTU1 小时前
python基础-13-处理excel电子表格
开发语言·python·excel
froginwe111 小时前
Perl 条件语句
开发语言
啥都鼓捣的小yao2 小时前
利用C++编写操作OpenCV常用操作
开发语言·c++·opencv
灼华十一2 小时前
Golang系列 - 内存对齐
开发语言·后端·golang
程序媛学姐2 小时前
SpringRabbitMQ消息模型:交换机类型与绑定关系
java·开发语言·spring
努力努力再努力wz2 小时前
【c++深入系列】:类与对象详解(中)
java·c语言·开发语言·c++·redis
Johnny_Cheung2 小时前
字符串、列表、元组、字典
开发语言·python
东方雴翾2 小时前
Scala语言的分治算法
开发语言·后端·golang