scala编程语言

一、练习

object Person {

def main(args: ArrayString):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: ArrayString): Unit = { println(Inner.in)

}

}

package zpark { object Inner {

val in: String = "in"

def main(args: ArrayString): 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: ArrayString): 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: ArrayString): Unit = {

var person = new Person()

println(person.name)

person.setSex(" 女 ")

println(person.getSex)

}

}

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: ArrayString): Unit = {

val person = new Person()

println(person.sum(10, 20))

}

}

2.4创建对象

1)基本语法

val | var 对象名 :类型 = new 类型()

2)案例实操

(1)val 修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值。

(2)var 修饰对象,可以修改对象的引用和修改对象的属性值

(3)自动推导变量类型不能多态,所以多态需要显示声明

class Person {

var name: String = "canglaoshi"

}

object Person {

def main(args: ArrayString): Unit = {

//val 修饰对象,不能改变对象的引用(即:内存地址),可以改变对象属性的值。

val person = new Person() person.name = "bobo"

// person = new Person()// 错误的

println(person.name)

}

}

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: ArrayString): Unit = {

val person2 = new Person(18)

}

}

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: ArrayString): 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)

}

}

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: ArrayString): Unit = {

new Emp("z3", 11,1001)

}

}

  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: ArrayString): Unit = {

val teacher: Teacher = new Teacher()

println(teacher.name)

teacher.hello()

val teacher1:Person = new Teacher

println(teacher1.name)

teacher1.hello()

}

}

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();

}

}

结果对比

|---|----------------------------------------------------------------------------|
| |
| | |

|---|----------------------------------------------------------------------------|
| |
| | |

相关推荐
Scott9999HH13 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社14 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海14 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖15 小时前
JDK 26 新特性详解
java·开发语言
马优晨16 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区18 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大18 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai18 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜19 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa19 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio