scala相关操作(三)
- 单例对象
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.scalaimport 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 Herolvbu.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 Persondef main(args: Array[String]): Unit = {// 2创建一个Student类对象实例,并设置name为“张三”val s = new Students.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 Persondef 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 = Students.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 Studentprintln(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 Persondef 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 Persondef 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_Iabstract 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_Idef main(args: Array[String]): Unit = {val s = new Studentval p = new Policemanprintln(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方法,通过创建匿名内部类的方式来实现Persondef 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 ConsoleLoggerc.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 MessageWorkerw.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.scalaimport 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 PaymentServicep.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 Personp.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=23println(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 == bprintln(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 Sexcase 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)}
}
scala相关操作(三)相关推荐
- rabbitmq 持久化_RabbitMQ原理与相关操作(三)消息持久化
现在聊一下RabbitMQ消息持久化: 问题及方案描述 1.当有多个消费者同时收取消息,且每个消费者在接收消息的同时,还要处理其它的事情,且会消耗很长的时间.在此过程中可能会出现一些意外,比如消息接收 ...
- 快学Scala习题解答—第三章 数组相关操作
原文链接:http://blog.csdn.net/ivan_pig/article/details/8257365 ----------------------------------------- ...
- Git入门与使用 (三) 使用GitHub进行代码托管的相关操作
文章目录 一.前言 二.使用GitHub进行代码托管的相关操作 1.推送本地仓库内容至远程仓库 2.克隆远程仓库内容至本地仓库 3.邀请他人加入项目团队 4.拉取远程仓库修改的内容 5.解决协同开发时 ...
- Hbase table DDL操作及scala API操作
Hbase shell操作table 建表 直接创建 ns3 是namespace,emp是表,base_info是列簇 hbase(main):037:0> create 'ns3:emp', ...
- 2021年大数据HBase(五):HBase的相关操作JavaAPI方式
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...
- 2021年大数据HBase(四):HBase的相关操作-客户端命令式!【建议收藏】
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-客户端命令式 1.进入HBase ...
- 2021年大数据Spark(二十五):SparkSQL的RDD、DF、DS相关操作
目录 RDD.DF.DS相关操作 SparkSQL初体验 SparkSession 应用入口 获取DataFrame/DataSet 使用样例类 指定类型+列名 自定义Schema ...
- Linux之用户相关操作
Linux之用户相关操作 1. 创建用户 [创建后会立即让设置密码] 命令 说明 useradd 创建(添加)用户 useradd命令选项: 选项 说明 -m 自动创建用户主目录,主目录的名字就是用 ...
- java导入包大全_eclipse快速导入jar包的相关操作步骤
eclipse怎样快速导入jar包呢?熟悉这款软件是非常简单的,今天小编就分享了关于eclipse快速导入jar包,有需要的朋友一起来看看吧! eclipse快速导入jar包的相关操作步骤 方法1·最 ...
最新文章
- Visual C++ 确定要使用的链接方法
- Day6 Pyhton基础之文件操作(五)
- P1119 灾后重建(经典floyd)
- 【学习排序】 Learning to Rank 中Listwise关于ListNet算法讲解及实现
- JSP、ASP、PHP Web应用程序怎么这么多P!
- package 和 install的区别
- 开发者的 Big Day!亚马逊 re:Invent 2020 参会学习攻略来啦~
- PCL之点云分割算法概述
- python是什么 自学-python自学需要什么软件?
- oracle行号排序问题
- Ubuntu下PDF编辑软件pdfedit
- ps把图片无损放大的方法
- qq邮箱foxmail imap服务器,开通IMAP服务 用Foxmail远程遥控QQ邮箱
- 支付宝沙箱版app登入失败账户不存在问题
- 文件MD5/SHA等校验码校验
- 一个免费识别验证码的接口
- python发朋友圈突破朋友圈限制_突破限制!原来朋友圈可以发长达5分钟的视频,后悔没早点知道...
- 《响应式Web图形设计》一1.4 布置页面内容
- OFFICE中的VBA库的定义
- 虎从风跃,龙借云行--神行者Wi10无线移动硬盘开启WIFI无线存储共享新时代_MID论坛_太平洋电脑网产品论坛...