函数
求和函数
一个函数,该函数可以求1到N的和,N可以由用户指定。通过递归调用自身实现累加,举例说明了当N为1、2、5时的计算过程。最后,函数返回从1加到N的结果。
水仙花数判断
孙水仙花数的概念,即一个N位数,其各位数字的N次幂之和等于它本身。
1. 步骤分解
确定位数:计算数字的位数 n。
分解各位数字:将数字拆分为各个位上的数字a1 a2 ..., an。
计算次方和:对每个数字计算 a 并求和。
比较结果:若和等于原数字,则为水仙花数。
包管理
scholar语言中的包管理,包括包的命名规则和管理风格。
包的三大作用:区分相同名字的类、管理类、控制访问范围。
详包的命名规则和两种包管理风格:嵌套风格和小圆点分隔风格。
案例如下
demo.class.exec1 //错误,因为 class 关键字
demo.12a //错误,数字开头
包对象
包对象的概念,即为每一个包定义一个同名的包对象,包对象中的成员可以被包下的所有类和对象直接访问。另一种风格,通过嵌套的风格表示层级关系,如下
package com{ package zpark{
package scala{}
}
第二种风格有以下特点:
- 一个源文件中可以声明多个 package
- 子包中的类可以直接访问父包中的内容,而无需导包
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 {
}
}
导包说明
scholar语言中的导包方式,包括全局导入、局部导入和通配符导入。通配符导入使用小横杠表示,而不是Java中的星号。
1.和 Java 一样,可以在顶部使用 import 导入,在这个文件中的所有类都可以使用。
2.局部导入:什么时候使用,什么时候导入。在其作用范围内都可以使用
3.通配符导入:import java.util._
4.给类起名:import java.util.{ArrayList=>JL}
5.导入相同包的多个类:import java.util.{HashSet, ArrayList}
6.屏蔽类:import java.util.{ArrayList =>_,_}
7.导入包的绝对路径:new _root_.java.util.HashMap
package java{ package util{class HashMap {}}
}
类和对象
scholar语言中类的定义语法,没有public关键字,但所有类默认具有公有可见性。
scholar语言中一个源文件可以包含多个类。
属性
属性是类的一个组成部分
属性具有自动生成功能,即自动生成set和get方法。
访问权限
对比Java和scholar语言中的访问权限设置
- Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。
- private 为私有权限,只在类的内部和伴生对象中可用。
- protected 为受保护权限,Scala 中受保护权限比 Java 中更严格,同类、子类可以访问,同包无法访问。
- private[包名]增加包访问权限,包名下的其他类也可以使用
在 Java 中,访问权限分为:public,private,protected 和默认。在 Scala 中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。
方法
类中方法的定义和使用,方法可以重写和重载。
强调了方法与函数的区别,方法可以在类内声明并重写。
案例如下
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))}
}
创建对象
scholar语言中创建对象的语法结构,包括VAL和VAR的区别。
对象的属性值可以改变,但对象引用不能改变。
构造器
构造器的概念和作用,构造器用于初始化对象的成员变量。
和 Java 一样,Scala 构造对象也需要调用构造方法,并且可以有任意多个构造方法。
Scala 类的构造器包括:主构造器和辅助构造器
说明:
- 辅助构造器,函数的名称 this,可以有多个,编译器通过参数的个数及类型来区分。
- 辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。
- 构造器调用其他另外的构造器,要求被调用构造器必须提前声明。
构造方法介绍:
构造方法的作用,类似于对象的“出生说明书”。
可以有多个构造方法,包括主构造器和辅助构造器。
构造方法的语法:
类的基本语法结构,包括类名、形态列表、花括号内的主构造器类体。
使用this关键字定义辅助构造器,可以通过参数的不同来区分多个辅助构造器。
/(1)如果主构造器无参数,小括号可省略
//class Person ()
{ class Person {var name: String = _ var age: Int = _def this(age: Int) {this() this.age = ageprintln("辅助构造器")}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)}
}
辅助构造器的特性:
辅助构造器的函数名称为this。可以有多个辅助构造器,编译器通过参数个数和类型区分。不同参数类型的辅助构造器的区分方式。
构造方法:
构造方法的基本概念:
构造方法的作用,类似于对象的“出生说明书”,在构造对象之前预先设定一些内容。
讲解了构造方法包括主构造器和辅助构造器。
构造方法的语法和使用:
构造方法的基本语法,包括类名、形态列表、主构造器和辅助构造器的定义。
强调了辅助构造器的命名规则是this,并且可以通过参数的个数和类型来区分不同的辅助构造器。
辅助构造器的调用规则:
辅助构造器不能直接构造对象,必须直接或间接调用主构造器。
辅助构造器调用其他构造器时,被调用的构造器必须提前声明。
构造器与面向对象编程
构造器
构造器是对象的出生说明书,在构造对象之前预先设定好属性。
构造器包括主构造器和辅助构造器,可以有多个辅助构造器。
构造器的语法
主构造器在类体中定义,辅助构造器使用 this 关键字。
辅助构造器的个数没有限制,通过参数个数和类型区分。
构造器的调用规则
辅助构造器必须直接或间接调用主构造器。
调用其他构造器时,必须在当前构造器之前声明。
构造器参数的修饰
无修饰:局部变量。
var 修饰:类的成员变量,可修改。
val 修饰:常量,只读属性。
面向对象的三大属性
封装
封装数据和操作数据的方式,隐藏内部接口,只暴露必要的接口。
通过私有化属性和提供公共的 get 和 set 方法实现。
继承
子类继承父类的属性和方法,可以扩展或修改。
继承的调用顺序是先父类构造器,再子类构造器。
多态
同一个方法在不同的子类中有不同的实现。
动态绑定,确保代码的多样性和功能的多样性。
代码示例与实操
构造器示例
无参数构造器、主构造器和辅助构造器的代码示例。
解释了构造器参数修饰的不同效果。
封装示例
通过私有化属性和 get、set 方法实现封装。 scholar 类中不推荐将属性设置为 public。
继承与多态示例
展示了子类继承父类的代码示例。
通过 teacher 类继承 person 类,展示了多态的实现。