• 2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)


    7、Scala中的apply方法()

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

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

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

    Object的apply方法举例:

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

    8、Scala中的继承

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

    案例一:Employee类继承Person类

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

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

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

    案例三:使用匿名子类

    1. //使用匿名子类来创建Person对象
    2. //这里我们创建了Person的一个匿名子类,并且在该子类中重写了sayHello方法。
    3. var p3:Person = new Person("Jerry",26) {
    4. override def sayHello(): String = "匿名子类中的sayHello方法"
    5. }
    6. println(p3.sayHello())

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

    1. //Scala中的抽象类
    2. //父类:抽象类
    3. abstract class Vehicle{
    4. //定义抽象方法
    5. def checkType():String
    6. }
    7. //子类
    8. class Car extends Vehicle {
    9. //实现checkType 方法
    10. override def checkType(): String = {"I am a Car"}
    11. }
    12. class Bycical extends Vehicle {
    13. //实现checkType方法
    14. override def checkType(): String = {"I am a bike"}
    15. }
    16. object Demo2 {
    17. //定义两个交通工具
    18. def main(args: Array[String]): Unit = {
    19. var v1:Vehicle = new Car
    20. println(v1.checkType())
    21. var v2:Vehicle = new Bycical
    22. println(v2.checkType())
    23. }
    24. }

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

    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(特质)

    1. package class4
    2. //Scala中的包对象:常量,变量,方法,类,对象,trait(特质)
    3. //定义一个包对象
    4. package object MyPackageObject {
    5. //常量
    6. val x:Int = 0
    7. //变量
    8. var y:String = "Hello World "
    9. //方法
    10. def sayHelloWorld():String = "Hello World"
    11. //类
    12. class MyTestClass {
    13. }
    14. //对象object
    15. object MyTestObject {
    16. }
    17. //特质 trait
    18. trait MyTestTrait {
    19. }
    20. }
    21. class Demo3 {
    22. //测试
    23. def method1 = {
    24. //导入需要的包对象
    25. import class4.MyPackageObject._
    26. //定义MyTestClass的一个对象
    27. var a= new MyTestClass
    28. }
    29. }

    12、Scala中的文件访问

    读取行

    1. val source = scala.io.Source.fromFile("e:\\temp\\a.txt")
    2. println(source.mkString)
    3. val lines = source.getLines()
    4. for(l<-lines) println(l.toString)

    读取字符

    1. val source = scala.io.Source.fromFile("e:\\temp\\a.txt")
    2. for(c <-source) println(c)

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

  • 相关阅读:
    .NET周报 【4月第2期 2023-04-08】
    关于用switch函数实现二叉树的问题
    [思维]Shortest Path in GCD Graph 2022杭电多校第9场 1008
    【基于然也物联MQTT的ESP遥控小车】
    第一次工业革命
    38-Jenkins-Publish over SSH插件实现远程部署
    大都会人寿线下培训第九天-通关了
    tomcat8.5配置https
    爬虫工作者必备:使用爬虫IP轻松获得最强辅助
    学习笔记-数据结构-树与二叉树(2024-04-23)
  • 原文地址:https://blog.csdn.net/pblh123/article/details/132624604