- 单例对象
24.1 定义单例对象
package com.ithe.scala
/**
*24.1 定义单例对象
* 示例
* 示例说明
* 1定义一个Dog单例对象,保存狗有几条腿
* 2在main方法中打印狗腿的数量
*/
object Demo24_1 {
// 1定义一个Dog单例对象,保存狗有几条腿
object Dog{
val LEG_NUM=4
}
// 2在main方法中打印狗腿的数量
def main(args: Array[String]): Unit = {
println(Dog.LEG_NUM)
}
}
24.2 在单例对象中定义成员方法
package com.ithe.scala
/**
*24.2 在单例对象中定义成员方法
* 示例
* 示例说明
* 1设计一个单例对象,定义一个能够打印分割线(15个减号)的方法
* 2在main方法调用该方法,打印分割线
*/
object Demo24_2 {
// 1设计一个单例对象,定义一个能够打印分割线(15个减号)的方法
object PrintUtil{
def printSpliter()=println("-"*15)
}
// 2在main方法调用该方法,打印分割线
def main(args: Array[String]): Unit = {
PrintUtil.printSpliter()
}
}
24.3 工具类案例
package com.ithe.scala
import java.text.SimpleDateFormat
import java.util.Date
/**
* 24.3 工具类案例
* 需求
* 1编写一个DateUtil工具类专门用来格式化日期时间
* 2定义一个方法,用于将日期(Date)转换为年月日字符串,例如:2030-10-05
* 步骤
* 1定义一个DateUtil单例对象,定义日期格式化方法format
* 2在format中,使用SimpleDateFormat将日期转换为字符串,并返回。
* 3在main方法中调用format方法。
*/
object Demo24_3 {
// 1定义一个DateUtil单例对象,定义日期格式化方法(format)
object DateUtil{
val SDF=new SimpleDateFormat("yyyy-MM-dd")
// 2在format中,使用SimpleDateFormat将日期转换为字符串,并返回。
def format(date:Date)=SDF.format(date)
}
//3在main方法中调用format方法。
def main(args: Array[String]): Unit = {
val date = DateUtil.format(new Date())
println(date)
}
}
- main方法
25.1 定义main方法
package com.ithe.scala
/**
* 25.1 定义main方法
* 示例
* 示例说明
* 创建一个单例对象,在该单例对象中打印"hello, scala"
*/
//本身就是单例对象
object Demo25_1 {
def main(args: Array[String]): Unit = {
println("hello,scala")
}
}
25.2 实现App Trait来定义入口
package com.ithe.scala
/**
* 25.2 实现App Trait来定义入口
* 示例说明
* 继承App特质,来实现一个入口。同样输出"hello, scala"
*/
//跟刚才的Demo8_1效果是一样的
object Demo25_2 extends App{
println("hello,scala")
}
- 伴生对象
26.1 定义伴生对象
package com.ithe.scala
/**
* 26.1 定义伴生对象
* 示例
* 示例说明
* 1编写一个英雄Hero类,打印
* 2编写一个Hero伴生对象,定义一个私有变量,用于保存作战武器的名称,比如方天画戟
* 3有一个作战方法,打印 "我要用【xxx】作战了"
* 4在main方法中创建Hero类的对象吕布,调用fight方法
*/
object Demo26_1 {
// 1编写一个英雄Hero类,打印
class Hero {
// 3有一个作战方法,打印 "我要用【xxx】作战了"
def fight() = println(s"我要用${Hero.weapon}作战了")
}
// 2编写一个Hero伴生对象,定义一个私有变量,用于保存作战武器的名称,比如方天画戟
object Hero{
private val weapon="方天画戟"
}
// 4在main方法中创建Hero类的对象吕布,调用fight方法
def main(args: Array[String]): Unit = {
val lvbu = new Hero
lvbu.fight()
}
}
26.2 private[this]访问权限
package com.ithe.scala
/**
* 26.2 private[this]访问权限
* 示例
* 示例说明
* 1定义一个Person类,包含一个name字段
* 2定义Person类的伴生对象,定义printPerson方法
* 3测试伴生对象是否能访问private[this]权限的成员
* 步骤
* 1定义一个Person类,包含一个name字段,仅用private修饰(不带[this])
* 2定义Person类的伴生对象,定义printPerson方法,访问Person类实例的name,是允许访问的
* 3在main方法中,创建Person类的对象,传入printPerson方法,看运行结果。
* 4另外将Person类的name字段,用private[this]修饰,此时printPerson方法无法访问name,编译报错。
*
*/
object Demo26_2 {
// 1定义一个Person类,包含一个name字段,仅用private修饰(不带[this])
class Person(private/*[this]*/ var name:String="")
// 2定义Person类的伴生对象,定义printPerson方法,访问Person类实例的name,是允许访问的
object Person{
def printPerson(p:Person)={
println(p.name)
}
}
def main(args: Array[String]): Unit = {
// 3在main方法中,创建Person类的对象,传入printPerson方法,看运行结果。
val p = new Person("张三")
Person.printPerson(p)
// 4另外将Person类的name字段,用private[this]修饰,此时printPerson方法无法访问name,编译报错。
}
}
26.3 apply方法
package com.ithe.scala
/**
* 26.3 apply方法
* 示例
* 示例说明
* 1定义一个Person类,它包含两个字段:姓名和年龄
* 2定义伴生对象,重写apply方法,使用Person类名就可以创建对象
* 3在main方法中创建该类的对象,并打印姓名和年龄
*/
object Demo26_3 {
// 1定义一个Person类,它包含两个字段:姓名和年龄
class Person(var name:String,var age:Int)
object Person{
// 2 定义伴生对象,重写apply方法,使用Person类名就可以创建对象
def apply(name: String, age: Int): Person = new Person(name, age)
}
// 3在main方法中创建该类的对象,并打印姓名和年龄
def main(args: Array[String]): Unit = {
val p = Person("张三",30)
println(p.name,p.age)
}
}
- 继承
27.1 定义语法
package com.ithe.scala
/**
* 27. 继承
* 27.1 定义语法
* 1定义一个Person类包含name属性,再定义一个Student类,继承自Person类
* 2创建一个Student类对象实例,并设置name为“张三”
* 3打印姓名
*/
object Demo27_1 {
// 1定义一个Person类,再定义一个Student类,继承自Person类
class Person(var name:String="")
class Student extends Person
def main(args: Array[String]): Unit = {
// 2创建一个Student类对象实例,并设置name为“张三”
val s = new Student
s.name="张三"
// 3打印姓名
println(s.name)
}
}
27.2 类继承
package com.ithe.scala
/**
*27.2 类继承
* 1 定义一个Person类包含name属性,getName()方法,再定义一个Student类,继承自Person类
* |--------------------|
* | <<class>> |
* | Person |
* |--------------------|
* | +var name:String |
* | +getName():String |
* |--------------------|
* ▲
* |
* |
* |--------------------|
* | <<class>> |
* | Student |
* |--------------------|
* 2创建一个Student类对象实例,并设置name为“张三”
* 3打印姓名
*/
object Demo27_2 {
//1定义一个Person类,再定义一个Student类,继承自Person类
class Person() {
var name: String = ""
def getName() = name
}
//2再定义一个Student类,继承自Person类
class Student extends Person
def main(args: Array[String]): Unit = {
//3创建一个Student类对象实例,并设置name为“张三”
val s = new Student()
s.name = "张三"
//4打印姓名
println(s.getName())
}
}
27.3 单例对象继承
package com.ithe.scala
/**
* 27.3 单例对象继承
* 示例说明
* 1 创建一个Student单例对象,让单例对象继承示例1中的Person类包括name和getName()
* 2 设置单例对象的名字为"张三",调用Student单例对象的getName方法
*/
object Demo27_3 {
// 1 创建一个Student单例对象,让单例对象继承示例1中的Person类包括name和getName()
class Person{
var name:String="super"
def getName()=name
}
object Student extends Person
// 2 设置单例对象的名字为"张三",调用Student单例对象的getName方法
def main(args: Array[String]): Unit = {
val s = Student
s.name="张三"
println(s.getName())
}
}
27.4 override和super
package com.ithe.scala
/**
* 27.4 override和super
* 示例
* 示例说明
* 1定义一个Person类,包含
* 姓名字段(不可重新赋值)
* 获取姓名方法
* 2定义一个Student类,继承Person类
* 重写姓名字段
* 重写获取姓名方法,返回"hello, " + 姓名
* 3在main方法中创建Student类的对象示例,调用它的getName方法
*/
object Demo27_4 {
// 1定义一个Person类,包含
// 姓名字段(不可重新赋值)
// 获取姓名方法
class Person{
val name:String="super"
def getName()=name
}
// 2定义一个Student类,继承Person类
// 重写姓名字段
// 重写获取姓名方法,返回"hello, " + 姓名
class Student extends Person{
override val name: String = "stu"
override def getName(): String = "hello,"+super.getName()
}
// 3在main方法中创建Student类的对象示例,调用它的getName方法
def main(args: Array[String]): Unit = {
val a = new Student
println(a.getName())
}
}
- 类型判断
28.1 isInstanceOf/asInstanceOf
package com.ithe.scala
/**
* 28. 类型判断
* 28.1 isInstanceOf/asInstanceOf
* 示例
* 示例说明
* 1定义一个Person类
* 2定义一个Student类继承自Person类
* 3创建一个Student类对象
* 4判断该对象是否为Student类型,如果是,将其转换为Student类型并打印该对象
*/
object Demo28_1 {
//1定义一个Person类
class Person
//2定义一个Student类继承自Person类
class Student extends Person
def main(args: Array[String]): Unit = {
//3创建一个Student类对象
val s = new Student
//4判断该对象是否为Student类型,如果是,将其转换为Student类型并打印该对象
if(s.isInstanceOf[Student]){
s.asInstanceOf[Student]
println(s)
}
}
}
28.2 getClass和classOf
package com.ithe.scala
/**
* 28.2 getClass和classOf
* 示例
* 示例说明
* 1定义一个Person类
* 2定义一个Student类继承自Person类
* 3创建一个Student类对象,并指定它的类型为Person类型
* 4测试使用isInstanceOf判断该对象是否为Person类型
* 5测试使用getClass/classOf判断该对象是否为Person类型
* 6测试使用getClass/classOf判断该对象是否为Student类型
*/
object Demo28_2 {
// * 示例
//示例说明
//1定义一个Person类
class Person
//2定义一个Student类继承自Person类
class Student extends Person
def main(args: Array[String]): Unit = {
//3创建一个Student类对象,并指定它的类型为Person类型
val a:Person = new Student
//4测试使用isInstanceOf判断该对象是否为Person类型
println(a.isInstanceOf[Person])
//5测试使用getClass/classOf判断该对象是否为Person类型
println(a.getClass==classOf[Person])
//6测试使用getClass/classOf判断该对象是否为Student类型
println(a.getClass==classOf[Student])
}
}
- 抽象类
29.1 定义
/**
**/
29.2 抽象方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cGfRtyl-1600772035320)(06-scala代码大纲.assets/1598844789964.png)]
package com.ithe.scala
/**
* 29. 抽象类
* 29.2 抽象方法
* 1设计4个类,表示上述图中的继承关系
* 2每一个形状都有自己求面积的方法,但是不同的形状计算面积的方法不同
* 步骤
* 1. 创建一个Shape抽象类,添加一个area抽象方法,用于计算面积
* 2. 创建一个Square正方形类,继承自Shape,它有一个边长的主构造器,并实现计算面积方法
* 3. 创建一个长方形类,继承自Shape,它有一个长、宽的主构造器,实现计算面积方法
* 4. 创建一个圆形类,继承自Shape,它有一个半径的主构造器,并实现计算面积方法
* 5. 编写main方法,分别创建正方形、长方形、圆形对象,并打印它们的面积
*/
object Demo29_2 {
//1. 创建一个Shape抽象类,添加一个area抽象方法,用于计算面积
abstract class Shape{
//计算面积
def area():Double
}
//2. 创建一个Square正方形类,继承自Shape,它有一个边长的主构造器,并实现计算面积方法
class Square(edge:Double/*边长*/) extends Shape{
override def area(): Double = edge*edge
}
//3. 创建一个长方形类,继承自Shape,它有一个长、宽的主构造器,实现计算面积方法
class Rectangle(length:Double/*长*/,width:Double/*宽*/) extends Shape{
override def area(): Double = length*width
}
//4. 创建一个圆形类,继承自Shape,它有一个半径的主构造器,并实现计算面积方法
class Circle(radius:Double/*半径*/) extends Shape {
override def area(): Double = Math.PI*radius*radius
}
//5. 编写main方法,分别创建正方形、长方形、圆形对象,并打印它们的面积
def main(args: Array[String]): Unit = {
val a:Shape=new Square(4)
println(a.area())
val b:Shape=new Rectangle(3,4)
println(b.area())
val c:Shape=new Circle(4)
println(c.area())
}
}
29.3 抽象字段
package com.ithe.scala
/**
* 29.3 抽象字段
* 示例
* 示例说明
* 1. 创建一个Person抽象类,它有一个String抽象字段WHO_AM_I
* 2. 创建一个Student类,继承自Person类,重写WHO_AM_I字段,初始化为学生
* 3. 创建一个Policeman类,继承自Person类,重写WHO_AM_I字段,初始化警察
* 4. 添加main方法,分别创建Student/Policeman的实例,然后分别打印WHO_AM_I
*/
object Demo29_3 {
//1. 创建一个Person抽象类,它有一个String抽象字段WHO_AM_I
abstract class Person{
var WHO_AM_I:String
}
//2. 创建一个Student类,继承自Person类,重写WHO_AM_I字段,初始化为学生
class Student extends Person{
override var WHO_AM_I: String = "学生"
}
//3. 创建一个Policeman类,继承自Person类,重写WHO_AM_I字段,初始化警察
class Policeman extends Person{
override var WHO_AM_I: String = "警察"
}
//4. 添加main方法,分别创建Student/Policeman的实例,然后分别打印WHO_AM_I
def main(args: Array[String]): Unit = {
val s = new Student
val p = new Policeman
println(s.WHO_AM_I)
println(p.WHO_AM_I)
}
}
- 匿名内部类
package com.ithe.scala
/**
* 30. 匿名内部类
* 示例
* 示例说明
* 1. 创建一个Person抽象类,并添加一个sayHello抽象方法
* 2. 添加main方法,通过创建匿名内部类的方式来实现Person
* 3. 调用匿名内部类对象的sayHello方法
*/
object Demo30 {
// 1. 创建一个Person抽象类,并添加一个sayHello抽象方法
abstract class Person{
def sayHello()
}
// 2. 添加main方法,通过创建匿名内部类的方式来实现Person
def main(args: Array[String]): Unit = {
val person = new Person {
override def sayHello(): Unit = println("我是一个匿名内部类")
}
// 3. 调用匿名内部类对象的sayHello方法
person.sayHello()
}
}
- 特质(trait)
31.1 定义
/**
**/
31.2 trait作为接口使用
package com.ithe.scala
/**
* 31.2 trait作为接口使用
* 示例一 继承单个trait
* 示例说明
* 1. 创建一个Logger特质,添加一个接受一个String类型参数的log抽象方法
* 2. 创建一个ConsoleLogger类,继承Logger特质,实现log方法,打印消息
* 3. 添加main方法,创建ConsoleLogger对象,调用log方法
*/
object Demo31_2_1 {
//1. 创建一个Logger特质,添加一个接受一个String类型参数的log抽象方法
trait Logger{
def log(msg:String)
}
//2. 创建一个ConsoleLogger类,继承Logger特质,实现log方法,打印消息
class ConsoleLogger extends Logger{
override def log(msg: String): Unit = println("来自控制台的日志:"+msg)
}
//3. 添加main方法,创建ConsoleLogger对象,调用log方法
def main(args: Array[String]): Unit = {
val c = new ConsoleLogger
c.log("这是一条日志")
}
}
package com.ithe.scala
/**
* 示例二、 继承多个trait
* 示例说明
* 1. 创建一个MessageSender特质,添加send方法
* 2. 创建一个MessageReceiver特质,添加receive方法
* 3. 创建一个MessageWorker实现这两个特质
* 4. 在main中调用,分别调用send方法、receive方法
*/
object Demo31_2_2 {
// 1. 创建一个MessageSender特质,添加send方法
trait MessageSender{
def send(msg:String)
}
// 2. 创建一个MessageReceiver特质,添加receive方法
trait MessageReceiver{
def receive():String
}
// 3. 创建一个MessageWorker实现这两个特质
class MessageWorker extends MessageSender with MessageReceiver{
override def send(msg: String): Unit = println("发送一条消息:"+msg)
override def receive() = "你好,我是一个好人"
}
// 4. 在main中调用,分别调用send方法、receive方法
def main(args: Array[String]): Unit = {
val w = new MessageWorker
w.send("你好鸭")
println(w.receive())
}
}
package com.ithe.scala
/**
* 示例三、 object继承trait
* 示例说明
* 1. 创建一个Logger特质,添加一个log抽象方法
* 2. 创建一个ConsoleLogger的object,继承Logger特质,实现log方法,打印消息
* 3. 编写main方法,调用ConsoleLogger的log方法
*/
object Demo31_2_3 {
// 1. 创建一个Logger特质,添加一个log抽象方法
trait Logger{
def log(msg:String)
}
// 2. 创建一个ConsoleLogger的object,继承Logger特质,实现log方法,打印消息
object ConsoleLogger extends Logger{
override def log(msg: String): Unit = println("控制台消息:"+msg)
}
// 3. 编写main方法,调用ConsoleLogger的log方法
def main(args: Array[String]): Unit = {
ConsoleLogger.log("这是一条日志")
}
}
31.3 定义具体的方法
package com.ithe.scala
/**
* 31.3 定义具体的方法
* 示例
* 示例说明
* 1. 定义一个Logger特质,添加具体的log方法
* 2. 定义一个UserService类,继承Logger特质
* 添加add方法,在add方法中调用log方法,打印"添加用户"
* 3. 添加main方法
* 创建UserService对象实例
* 调用add方法
*/
object Demo31_3 {
// 1. 定义一个Logger特质,添加具体的log方法
trait Logger{
def log(msg:String)
}
// 2. 定义一个UserService类,继承Logger特质
class UserService extends Logger{
override def log(msg: String): Unit = println(msg)
// 添加一个具体方法,名叫add,在add方法中调用log方法,打印"添加用户"
def add()=log("打印用户")
}
// 3. 添加main方法
def main(args: Array[String]): Unit = {
// 创建UserService对象实例
val u = new UserService
// 调用add方法
u.add()
}
}
31.4 trait中定义具体的字段和抽象的字段
package com.ithe.scala
import java.text.SimpleDateFormat
import java.util.Date
/**
* 31.4 trait中定义具体的字段和抽象的字段
* 示例
* 示例说明
* 通过trait来实现一个日志输出工具,该日志工具可以自动添加日志的日期
* 步骤
* 1. 创建Logger特质
* 定义一个具体的SimpleDateFormat字段,用来格式化日期(显示到时间)
* 定义一个抽象字段TYPE,用于表示日志的级别
* 创建一个log抽象方法,用于输出日志
* 2. 创建ConsoleLogger类,
* 重写TYPE抽象字段
* 重写log方法,输出日志格式为: 日志级别 时间 日志内容
* 3. 添加main方法
* 创建ConsoleLogger类对象
* 调用log方法,打印“用户A登录了系统”
*/
object Demo31_4 {
// 1. 创建Logger特质
trait Logger{
// 定义一个具体的SimpleDateFormat字段,用来格式化日期(显示到时间)
val sdf=new SimpleDateFormat("yyyy-DD-mm HH-mm-ss")
// 定义一个抽象字段TYPE,用于表示日志的级别
val TYPE :String
// 创建一个log抽象方法,用于输出日志
def log(msg:String)
}
// 2. 创建ConsoleLogger类
class ConsoleLogger extends Logger{
// 重写TYPE抽象字段
override val TYPE: String = "info"
// 重写log方法,输出日志格式为: 日志级别 时间 日志内容
override def log(msg: String): Unit = {
val info = s"$TYPE ${sdf.format(new Date())}:$msg"
println(info)
}
}
// 3. 添加main方法
def main(args: Array[String]): Unit = {
// 创建ConsoleLogger类对象
val c = new ConsoleLogger
// 调用log方法
c.log("用户A登录了系统")
}
}
31.5 使用trait实现模板模式
package com.ithe.scala
/**
* 31.5 使用trait实现模板模式
* 示例说明
* 编写一个日志输出工具,分别有info、warn、error三个级别的日志输出
* 日志输出的方式要求设计为可扩展的,例如:可以输出到控制台、将来也可以扩展输出到文件、数据库等
* 实现步骤
* 1. 添加一个Logger特质
* 添加一个log抽象方法
* 添加三个info、warn、error具体方法,他们都调用log抽象方法。就像信用卡提前透支,此处提前使用log方法,log()的具体内容留给以后再去实现。
* 2. 创建ConsoleLogger类,继承Logger特质,实现log方法,打印入参即可
* 3. 添加main方法
* 创建ConsoleLogger类对象
* 分别调用info、warn、error方法输出日志
*/
object Demo31_5 {
// 1. 添加一个Logger特质
trait Logger {
// 添加一个log抽象方法
def log(msg: String)
// 添加三个info、warn、error具体方法,他们都调用log抽象方法。就像信用卡提前透支,此处提前使用log方法,log()的具体内容留给以后再去实现。
def info(msg:String)=log("INFO:"+msg)
def warn(msg:String)=log("WARN:"+msg)
def error(msg:String)=log("ERROR:"+msg)
}
// 2. 创建ConsoleLogger类,继承Logger特质,实现log方法,打印入参即可
class ConsoleLogger extends Logger{
override def log(msg: String): Unit = println(msg)
}
// 3. 添加main方法
def main(args: Array[String]): Unit = {
// 创建ConsoleLogger类对象
val c = new ConsoleLogger
// 分别调用info、warn、error方法输出日志
c.info("信息日志")
c.warn("警告日志")
c.error("错误日志")
}
}
31.6 对象混入trait
package com.ithe.scala
/**
* 31.6 对象混入trait
* 示例
* 给一个对象添加一些额外的行为
* 步骤
* 1. 创建一个Logger特质
* 添加一个log实现方法,打印参数
* 2. 定义一个UserService类
* 3. 添加main方法
* 创建UserService对象,混入Logger特质
* 调用log方法
*/
object Demo31_6 {
// 1. 创建一个Logger特质
trait Logger{
// 添加一个log实现方法,打印参数
def log(msg:String)=println(msg)
}
// 2. 定义一个UserService类
class UserService
// 3. 添加main方法
def main(args: Array[String]): Unit = {
// 创建UserService对象,混入Logger特质
val u = new UserService with Logger
// 调用log方法
u.log("混入的方法")
}
}
31.7 trait实现调用链模式
31.8 trait调用链
/**
实现一个模拟支付过程的调用链
**/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxmOE4az-1600772035324)(06-scala代码大纲.assets/1598845223710.png)]
package com.ithe.scala
/**
* 31.8 trait调用链
* 步骤
* 1. 定义一个HandlerTrait特质
* 定义一个具体的handler方法,打印"处理数据..."
* 2. 定义一个DataValidHandlerTrait,继承HandlerTrait特质
* 重写handler方法,打印"验证数据"
* 调用父特质的handler方法
* 3. 定义一个SignatureValidHandlerTrait,继承HandlerTrait特质
* 重写Handler方法
* 打印"检查签名"
* 调用父特质的handler方法
* 4. 创建一个PaymentService类
* 继承DataValidHandlerTrait
* 继承SignatureValidHandlerTrait
* 定义pay方法
* 打印"准备支付"
* 调用父特质的handler方法
* 5. 添加main方法
* 创建PaymentService对象实例
* 调用pay方法
*/
object Demo31_8 {
//1. 定义一个HandlerTrait特质
trait HandlerTrait {
// 定义一个具体的handler方法,打印"处理数据..."
def handler(data: String) = println("处理数据")
}
//2. 定义一个DataValidHandlerTrait,继承HandlerTrait特质
trait DataValideHandlerTrait extends HandlerTrait {
// 重写handler方法,打印"验证数据"
override def handler(data: String): Unit = {
println("校验数据")
// 调用父特质的handler方法
super.handler(data)
}
}
//3. 定义一个SignatureValidHandlerTrait,继承HandlerTrait特质
// 重写Handler方法
// 打印"检查签名"
// 调用父特质的handler方法
trait SignatureValidHandlerTrait extends HandlerTrait {
override def handler(data: String): Unit = {
println("检查签名")
super.handler(data)
}
}
//4. 创建一个PaymentService类
// 继承DataValidHandlerTrait
// 继承SignatureValidHandlerTrait
// 定义pay方法
// 打印"准备支付"
// 调用父特质的handler方法
class PaymentService extends DataValideHandlerTrait with SignatureValidHandlerTrait {
def pay() = {
println("1准备支付")
super.handler("支付参数")
}
}
//5. 添加main方法
// 创建PaymentService对象实例
// 调用pay方法
def main(args: Array[String]): Unit = {
val p = new PaymentService
p.pay()
}
}
31.9 trait的构造机制
package com.ithe.scala
/**
* 31.9 trait的构造机制
* 示例
* 示例说明
* 定义多个特质,然后用一个类去实现它们
* 测试trait的构造顺序
* 步骤
* 1. 创建一个Logger特质,在构造器中打印"执行Logger构造器!"
* 2. 创建一个MyLogger特质,继承自Logger特质,,在构造器中打印"执行MyLogger构造器!"
* 3. 创建一个TimeLogger特质,继承自Logger特质,在构造器中打印"执行TimeLogger构造器!"
* 4. 创建一个Person类,在构造器中打印"执行Person构造器!"
* 5. 创建一个Student类,继承自Person、MyLogger、TimeLogger特质,在构造器中打印"执行Student构造器!"
* 6. 添加main方法,实例化Student_One类,观察输出。
*/
object Demo31_9 {
//步骤
//1. 创建一个Logger特质,在构造器中打印"执行Logger构造器!"
trait Logger{
println("2执行Logger构造器!")
}
//2. 创建一个MyLogger特质,继承自Logger特质,,在构造器中打印"执行MyLogger构造器!"
trait MyLogger extends Logger{
println("3执行MyLogger构造器")
}
//3. 创建一个TimeLogger特质,继承自Logger特质,在构造器中打印"执行TimeLogger构造器!"
trait TimeLogger extends Logger{
println("4执行TimeLogger构造器")
}
//4. 创建一个Person类,在构造器中打印"执行Person构造器!"
class Person {
println("1执行Person构造器")
}
//5. 创建一个Student类,继承自Person、MyLogger、TimeLogger特质,在构造器中打印"执行Student构造器!"
class Student extends Person with MyLogger with TimeLogger{
println("5执行Student构造器")
}
//6. 添加main方法,实例化Student_One类,观察输出。
def main(args: Array[String]): Unit = {
val s = new Student
}
}
31.10 trait继承class
package com.ithe.scala
/**
* 31.10 trait继承class
* 示例
* 示例说明
* 定义一个特质,继承自一个class
* 步骤
* 1. 创建一个MyUtils类,定义printMsg方法,打印传入的信息
* 2. 创建一个Logger特质,继承自MyUtils,定义log方法,打印Logger:传入的信息
* 3. 创建一个Person类,添加name字段
* 继承Logger特质
* 定义 sayHello方法,调用log方法
* 4. 添加main方法,创建一个Person对象,调用sayHello方法
*/
object Demo31_10 {
//步骤
//1. 创建一个MyUtils类,定义printMsg方法,打印传入的信息
class MyUtils{
def printMsg(msg:String)=println(msg)
}
//2. 创建一个Logger特质,继承自MyUtils,定义log方法,打印Logger:传入的信息
trait Logger extends MyUtils{
def log(msg:String)=println("Logger:"+msg)
}
//3. 创建一个Person类,添加name字段
// 继承Logger特质
// 定义sayHello方法,调用log方法
class Person extends Logger{
var name:String=""
def sayHello(msg:String)=log(msg)
}
//4. 添加main方法,创建一个Person对象,调用sayHello方法
def main(args: Array[String]): Unit = {
val p = new Person
p.sayHello("hello")
}
}
- 样例类
32.1 定义样例类
/**
**/
32.2 定义一个样例类
package com.ithe.scala
/**
* 32. 样例类
* 32.2 定义一个样例类
* 需求
* 1 定义一个Person样例类,包含姓名和年龄成员变量
* 2 创建样例类的对象实例("张三"、20),并打印它
*/
object Demo32_2 {
// 1 定义一个Person样例类,包含姓名和年龄成员变量
case class Person(name:String,age:Int)
// 2 创建样例类的对象实例("张三"、20),并打印它
def main(args: Array[String]): Unit = {
val a = Person("张三",20)
println(a)
}
}
32.3 可变成员变量
package com.ithe.scala
/**
* 32.3 可变成员变量
* 需求
* 1 定义一个Person样例类,包含姓名和年龄(可变)成员变量
* 2 创建样例类的对象实例("张三"、20)
* 3 修改张三的年龄为23岁,并打印
*/
object Demo32_3 {
// 1 定义一个Person样例类,包含姓名和年龄成员变量
case class Person(name:String,var age:Int)
// 2 创建样例类的对象实例("张三"、20)
// 3 修改张三的年龄为23岁,并打印
def main(args: Array[String]): Unit = {
val p = Person("张三",20)
p.age=23
println(p)
}
}
32.4 样例类的方法
32.4.1 apply方法
package com.ithe.scala
/**
* 32.4 样例类的方法
* 32.4.1 apply方法
* apply方法可以让我们快速地使用类名来创建对象。
* 案例
* 定义一个样例类CasePerson,属性包括姓名name,年龄age。
* 用免new的方式直接创建一个对象
*/
object Demo32_4_1 {
// 定义一个样例类CasePerson,属性包括姓名name,年龄age。
case class CasePerson(name:String,age:Int)
// 免new的方式创建一个对象
def main(args: Array[String]): Unit = {
val a=CasePerson("李四",30) //说明重写了apply()方法
println(a) //说明重写了toString()方法
}
}
32.4.2 toString方法
package com.ithe.scala
/**
*32.4.2 toString方法
* 案例
* 调用上面的对象的toString方法试试。
*/
object Demo32_4_2 {
case class CasePerson(name: String, age: Int)
def main(args: Array[String]): Unit = {
val a = CasePerson("李四", 30)
//打印a等价于调用对象a的toString方法
println(a.toString)
}
}
32.4.3 equals方法
package com.ithe.scala
/**
* 32.4.3 equals方法
* 示例
* 1 创建一个样例类Person,包含姓名、年龄
* 2 创建名字年龄分别为"李四", 21的两个对象
* 3 比较它们是否相等
*/
object Demo32_4_3 {
// 1 创建一个样例类Person,包含姓名、年龄
case class Person(name:String,age:Int)
// 2 创建名字年龄分别为"李四", 21的两个对象
// 3 比较它们是否相等
def main(args: Array[String]): Unit = {
val a = Person("李四",21)
val b = Person("李四",21)
println(a == b) //true, 因为比较的是属性值
println(a.equals(b)) //true, 因为底层自动帮我们重写了equals()方法, 等价于 a == b
println(a.eq(b)) //false,因为比较的是地址值
}
}
32.4.4 hashCode方法
package com.ithe.scala
/**
* 32.4.4 hashCode方法
* 1 创建名字年龄分别为"李四", 21的对象
* 2 再创建一个名字年龄分别为"李四", 22的对象
* 3 分别打印这两个对象的哈希值
*/
object Demo32_4_4 {
case class Person(name: String, age: Int)
def main(args: Array[String]): Unit = {
//1 创建名字年龄分别为"李四", 21的对象
val a = Person("李四", 21)
//2 再创建一个名字年龄分别为"李四", 22的对象
val b = Person("李四", 22)
//3 分别打印这两个对象的哈希值
println(a.hashCode())
println(b.hashCode())
println("-"*15)
//补充内容:内容不同,但是哈希值相同的特例:重地 和 通话,儿女 和 农丰
println("重地".hashCode)
println("通话".hashCode)
println("-"*15)
println("儿女".hashCode)
println("农丰".hashCode)
}
}
32.4.5 copy方法
package com.ithe.scala
/**
* 32.4.5 copy方法
* 示例
* 1 创建名字年龄分别为"李四", 21的对象
* 2 通过copy拷贝,名字为"王五"的对象
*/
object Demo32_4_5 {
case class Person(name: String, age: Int)
def main(args: Array[String]): Unit = {
//1 创建名字年龄分别为"李四", 21的对象
val a = Person("李四", 21)
//2 通过copy拷贝,名字为"王五"的对象
val b = a.copy(name = "王五")
println(a)
println(b)
}
}
- 样例对象
33.1 定义
/**
**/
33.2 定义枚举
package com.ithe.scala
/**
* 33.2 定义枚举
* 需求说明
* 1 创建一个Trait,表示性别Sex枚举,
* 2 定义它的两个实例,样例对象(男性——Male、女性——Female)
* 3 创建一个Person样例类,它有两个成员(姓名、性别)
* 4 创建两个Person对象("张三"、男性)、("李四"、"女")
*/
object Demo33_2 {
//1 创建一个Trait,表示性别Sex枚举,
trait Sex
//2 定义它的两个实例,样例对象(男性——Male、女性——Female)
case object Male extends Sex
case object Female extends Sex
//3 创建一个Person样例类,它有两个成员(姓名、性别)
case class Person(name: String, sex: Sex)
//4 创建两个Person对象("张三"、男性)、("李四"、"女")
def main(args: Array[String]): Unit = {
val a = Person("张三", Male)
val b = Person("李四", Female)
println(a)
println(b)
}
}