• Scala面向对象部分演示(IDEA开发)


    1、面向对象的基本概念

    把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象,面向

    对象的三大特征:

    •  封装

    •  继承

    •  多态

    2、类的定义

    简单类和无参方法

    1. class Counter{
    2. private var value =0;
    3. def increment() { value+=1};
    4. def current() =value;
    5. }

    //注意:class 前面没有public 关键字修饰

    如果要开发main方法,需要将main方法定义在该类的伴生对象中,即:object对

    象中,(后续做详细的讨论):

    在idea中创建以下文件:

     

     

    1. class Counter {
    2. private var value = 0;
    3. def increment() {
    4. value += 1
    5. };
    6. def current() = value;
    7. }
    1. class Student1 {
    2. //定义属性
    3. private var stuName:String = "Tom"
    4. private var stuAge:Int =20
    5. //成员方法
    6. def getStuName():String = stuName
    7. def setStuName(newName:String) =this.stuName=newName
    8. def getStuAge():Int = stuAge
    9. def setStuAge(newAge:Int) = this.stuAge=newAge
    10. }
    1. object student {
    2. def main(args: Array[String]): Unit = {
    3. //测试student1
    4. var s1 = new Student1
    5. //第一次输出
    6. println(s1.getStuName() + "\t" + s1.getStuAge())
    7. //调用set方法
    8. s1.setStuName("Mary")
    9. s1.setStuAge(25)
    10. //第二次输出
    11. println(s1.getStuName() + "\t" + s1.getStuAge())
    12. //第三次输出
    13. // println(s1.stuName + "\t" + s1.stuAge)
    14. }
    15. }

     

     运行结果:

     

    3、属性的getter和setter方

    当定义属性是private时候,scala会自动为其生成对应的get和set方法,如下所

    示:

    private var stuName:String = "Tom"

    get方法: stuName ----> s2.stuName() 由于stuName是方法的名字,所

    以可以加上一个括号

    set方法: stuName_= ----> stuName_= 是方法的名字

    定义属性:private var money:Int = 1000 希望money只有get方法,没有

    set方法??

    办法:将其定义为常量private val money:Int = 1000

    private[this]的用法:该属性只属于该对象私有,就不会生成对应的set和

    get方法。如果这样,就不能直接调用,例如:s1.stuName ---> 错误

    //属性的get 和 set 方法

    /*

    1.当定义属性是private 时候,scala会自动为其生成对应的get 和set方法

    private var stuName:String = "Tom"

    (1) get 方法:stuName ----> s2.stuName()

    (2) set 方法:stuName_=

    2.定义属性:private var money:Int = 1000 希望money只有get方法,没有set方法?

    方法:将其定义为常量private val money:Int = 1000

    3.private[this]

    3.private[this]的方法:该属性只属于该对象私有,就不会生成对应的set和get方法

    */

    1. class Student2 {
    2. //定义属性
    3. private var stuName:String = "Tom"
    4. //private [this] var stuAge:Int =20
    5. private var stuAge:Int = 20
    6. private val money:Int = 1000
    7. }

    //测试

    1. object Student2 {
    2. def main(args: Array[String]): Unit = {
    3. var s2 = new Student2
    4. println(s2.stuName + "\t" + s2.stuAge)
    5. println(s2.stuName + "\t" +s2.stuAge + "\t" + s2.money)
    6. //修改money的值 --》 error
    7. //s2.money = 2000
    8. }
    9. }

    4、内部类(嵌套类)

    我们可以在一个类的内部在定义一个类,如下:我们在Student类中,再定义了

    一个Course类用于保存学生选修的课程:

    1. import scala.collection.mutable.ArrayBuffer
    2. //嵌套类:内部类
    3. class Student3 {
    4. //定义一个内部类:记录学生选修的课程信息
    5. class Course(val courseName:String,val credit:Int){
    6. //定义其他方法
    7. }
    8. private var stuName:String = "Tom"
    9. private var stuAge:Int = 20
    10. //定义一个ArrayBuffer记录学生选修的所有课程
    11. private var courseList = new ArrayBuffer[Course]()
    12. //定义方法往学生信息中添加新的课程
    13. def addNameCourse(cname:String,credit:Int): Unit ={
    14. //创建新的课程
    15. var c = new Course(cname,credit)
    16. //将课程加入list
    17. courseList += c
    18. }
    19. }

    //测试

    1. object Student3 {
    2. def main(args: Array[String]): Unit = {
    3. //创建学生对象
    4. var s3 = new Student3
    5. //给该学生添加新的课程
    6. s3.addNameCourse("Chinese",2)
    7. s3.addNameCourse("English",3)
    8. s3.addNameCourse("Math",4)
    9. //输出
    10. println(s3.stuName + "\t" + s3.stuAge)
    11. println("*********选修课程***********")
    12. for (s <-s3.courseList) println(s.courseName + "\t" + s.credit)
    13. }
    14. }

    5、类的构造器

    类的构造器分为:主构造器、辅助构造器

    主构造器:和类的声明结合在一起,只能有一个主构造器

    Student4(val stuName:String,val stuAge:Int)

    (1) 定义类的主构造器:两个参数

    (2) 声明了两个属性:stuName和stuAge 和对应的get和set方法

    辅助构造器:可以有多个辅助构造器,通过关键字this来实现

    /*

    类的构造器

    1.主构造器:和类的声明结合在一起;只能有一个主构造器

    Student4(val stuName:String,var stuAge:Int)

    (1)定义类的主构造器:两个参数

    (2)声明了两个属性:stuName和stuAge 和 对应的get 和 set 方法

    2.辅助构造器:可以有多个辅助构造器

    通过关键字this 来实现

    */

    1. class Student4 (val stuName:String,val stuAge:Int) {
    2. //定义辅助构造器
    3. def this(age:Int){
    4. //调用主构造器
    5. this("no name",age)
    6. }
    7. }
    1. object Student4 {
    2. def main(args: Array[String]): Unit = {
    3. //创建Student4的一个对象
    4. var s4 = new Student4("Tom",20)
    5. println(s4.stuName + "\t" +s4.stuAge)
    6. //创建一个新的Student4 的对象
    7. var s42 = new Student4(25)
    8. println(s42.stuName + "\t" + s42.stuAge)
    9. }
    10. }

    6、Scala中的Object对象

    Scala没有静态的修饰符,但Object对象下的成员都是静态的 ,若有同名的

    class,这其作为它的伴生类。在Object中一般可以为伴生类做一些初始化等操

    作。下面是Java中的静态块的例子。在这个例子中,我们对JDBC进行了初始化:

    而Scala中的Object就相当于Java中静态块。

    在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的

    实现方法,那就是使用关键字 object。

    Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对

    象,它和类的区别是,object对象不能带参数。

    当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:

    companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为

    是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问

    其私有成员。

    Object对象的应用 

    单例对象

    //利用object 对象实现单例模式

    1. object CreditCard {
    2. //变量保存信用卡号,这里比较好的做法,是定义成private[this],即:该属性只属于该对象,这个方法由于定义在object中,所以是静态的,即:单例的
    3. private[this] var creditCardNumber:Long = 0
    4. //产生新的卡号
    5. def generateNewCCNumber():Long = {
    6. creditCardNumber += 1
    7. creditCardNumber
    8. }

    //测试程序

    1. def main(args: Array[String]): Unit = {
    2. //产生新的卡号
    3. println(CreditCard.generateNewCCNumber())
    4. println(CreditCard.generateNewCCNumber())
    5. println(CreditCard.generateNewCCNumber())
    6. println(CreditCard.generateNewCCNumber())
    7. }
    8. }

    使用应用程序对象:可以省略main方法;需要从父类App继承。

    //使用应用程序对象,可以省略main方法

    1. object HelloWorld extends App{
    2. /*
    3. def main(args: Array[String]): Unit = {
    4. //这里的main就可以不写。相当于下面的代码是在main方法中执行的。
    5. }
    6. */
    7. println("Hello World")
    8. ///如何取得命令行的参数
    9. if(args.length > 0) {
    10. println(args(0))
    11. }else{
    12. println("no arguents")
    13. }
    14. }

    7、Scala中的apply方法()

    遇到如下形式的表达式时,apply方法就会被调用:

    Object(参数1,参数2,......,参数N)

    通常,这样一个apply方法返回的是伴生类的对象;其作用是为了省略new关键字

    Object的apply方法举例:

    1. //object的apply方法
    2. class Student5(val stuName:String) {
    3. }

     

    1. object Student5 {
    2. //定义自己的apply方法
    3. def apply(stuName: String) = {
    4. println("*********Apply in Object **********")
    5. new Student5(stuName)
    6. }
    7. //如果没有这个apply方法,下面创建Mary的时候就会报错
    8. def main(args: Array[String]): Unit = {
    9. var s51 = new Student5("Tom")
    10. println(s51.stuName)
    11. var s52 = new Student5("Mary")
    12. //由于省略了new关键字,创建这个对象的时候,就会在Object找对应的apply方法
    13. println(s52.stuName)
    14. }
    15. }

    8、Scala中的继承

    Scala和Java一样,使用extends关键字扩展类。

    案例一:Employee类继承Person类

    //演示Scala的维承父类

    1. class Person(val name:String,val age:Int) {
    2. //定义结果
    3. def sayHello():String = "Hello" + name + " and the age is " + age
    4. }

    //子类

    1. class Employee (override val name:String,override val age:Int,val salary:Int) extends Person(name,age){
    2. //重新父类的sayHello方法
    3. //注意override 是关键字
    4. override def sayHello(): String = "子类中的sayHello方法"
    5. }
    1. object Demo {
    2. //测试程序
    3. def main(args: Array[String]): Unit = {
    4. //创建一个Employee的对象
    5. var p2:Person = new Employee("Mike",25,1000)
    6. println(p2.sayHello())
    7. //使用匿名子类来创建Person对象
    8. //这里我们创建了Person的一个匿名子类,并且在该子类中重写了sayHello方法。
    9. var p3:Person = new Person("Jerry",26) {
    10. override def sayHello(): String = "匿名子类中的sayHello方法"
    11. }
    12. println(p3.sayHello())
    13. }
    14. }

    案例二:在子类中重写父类的方法

    //子类

    1. class Employee (override val name:String,override val age:Int,val salary:Int) extends Person(name,age){
    2. //重新父类的sayHello方法
    3. override def sayHello(): String = "子类中的sayHello方法"
    4. }

    案例三:使用匿名子类

    //使用匿名子类来创建Person对象

    //这里我们创建了Person的一个匿名子类,并且在该子类中重写了sayHello方法。

    1. var p3:Person = new Person("Jerry",26) {
    2. override def sayHello(): String = "匿名子类中的sayHello方法"
    3. }
    4. println(p3.sayHello())

    案例四:使用抽象类。抽象类中包含抽象方法,抽象类只能用来继承。

    //Scala中的抽象类

    //父类:抽象类

    1. abstract class Vehicle{
    2. //定义抽象方法
    3. def checkType():String
    4. }

    //子类

    1. class Car extends Vehicle {
    2. //实现checkType 方法
    3. override def checkType(): String = {"I am a Car"}
    4. }
    1. class Bycical extends Vehicle {
    2. //实现checkType方法
    3. override def checkType(): String = {"I am a bike"}
    4. }
    1. object Demo2 {
    2. //定义两个交通工具
    3. def main(args: Array[String]): Unit = {
    4. var v1:Vehicle = new Car
    5. println(v1.checkType())
    6. var v2:Vehicle = new Bycical
    7. println(v2.checkType())
    8. }
    9. }

    案例五:使用抽象字段。抽象字段就是一个没有初始值的字段

    1. package class4
    2. //Scala中的抽象字段:就是没有初始值的字段
    3. //抽象的父类
    4. abstract class Person{
    5. //第一个抽象字段,并且只有get方法
    6. val id:Int
    7. //另一个抽象字段,并且有get和set方法
    8. var name:String
    9. }
    10. //子类:应该提供抽象字段的初始值,否则该子类也,应该是抽象的
    11. abstract class Employee1 extends Person {
    12. //val id:Int = 1
    13. var name:String = "No Name"
    14. }
    15. class Employee2(val id:Int) extends Person {
    16. var name:String = "No Name"
    17. }
    18. object Demo3 {
    19. def main(args: Array[String]): Unit = {
    20. var a:Person = new Employee2(1)
    21. println(a.id,a.name)
    22. }
    23. }

    9、Scala中的trait(特质)

    trait就是抽象类。trait跟Java抽象类最大的区别:trait支持多重继承


     

    1. package class4
    2. /*
    3. * Scala中的trait
    4. * 1.trait 就是抽象类
    5. * 2.区别:trait 支持多重继承
    6. */
    7. //第一个trait
    8. trait Human {
    9. val id:Int
    10. val name:String
    11. //方法
    12. def sayHello():String = "Hello" + name
    13. }
    14. //第二个trait
    15. trait Actions {
    16. //抽象方法
    17. def getActionNames():String
    18. }
    19. //子类
    20. class Student(val id:Int,val name:String) extends Human with Actions {
    21. override def getActionNames(): String = "Action is running"
    22. }
    23. object Demo4 {
    24. def main(args: Array[String]): Unit = {
    25. //创建一个student的对象
    26. var s1 = new Student(1,"Tom")
    27. println(s1.sayHello())
    28. println(s1.getActionNames())
    29. }
    30. }

    10、包的使用

    Scala的包和Java中的包或者C++中的命名空间的目的是相同的:管理大型程序中的名称。

    Scala中包的定义和使用:

    包的定义

    包的引入:Scala中依然使用import作为引用包的关键字,例如

    而且Scala中的import可以写在任意地方

    11、包对象

    包可以包含类、对象和特质,但不能包含函数或者变量的定义。很不幸,这是

    Java虚拟机的局限。把工具函数或者常量添加到包而不是某个Utils对象,这是

    更加合理的做法。Scala中,包对象的出现正是为了解决这个局限。Scala中的包

    对象:常量,变量,方法,类,对象,trait(特质)

    package class4

    //Scala中的包对象:常量,变量,方法,类,对象,trait(特质)

    //定义一个包对象


     

    1. package object MyPackageObject {
    2. //常量
    3. val x:Int = 0
    4. //变量
    5. var y:String = "Hello World "
    6. //方法
    7. def sayHelloWorld():String = "Hello World"

    //类

    1. class MyTestClass {
    2. }
    3. //对象object
    4. object MyTestObject {
    5. }
    6. //特质 trait
    7. trait MyTestTrait {
    8. }
    9. }
    1. class Demo3 {
    2. //测试
    3. def method1 = {
    4. //导入需要的包对象
    5. import class4.MyPackageObject._
    6. //定义MyTestClass的一个对象
    7. var a= new MyTestClass
    8. }
    9. }

    12、Scala中的文件访问

    读取行

    val source = scala.io.Source.fromFile("d:\\temp\\a.txt")

    println(source.mkString)

    val lines = source.getLines()

    for(l<-lines) println(l.toString)

    读取字符

    val source = scala.io.Source.fromFile("d:\\temp\\a.txt")

    for(c <-source) println(c)

    其实这里的source就指向了这个文件中的每个字符。

  • 相关阅读:
    EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565
    Elasticsearch:使用 ESRE 和生成式 AI 了解 TLS 日志错误
    [AGC057D] Sum Avoidance
    超分之VRT
    嵌入式学习笔记(47)Nand的常见操作及流程分析
    9.nginx代理
    UDP与TCP协议
    字节的一个小问题 npm 和 yarn不一样吗?
    postgrest API CURD数据库
    Zookeeper & Kafka 开启安全认证的配置
  • 原文地址:https://blog.csdn.net/qq_58476985/article/details/127671526