God of spark is Scala---面向对象编程(中级篇)

一. 包

1. Scala包的基本介绍

和Java一样,Scala中管理项目可以使用包,但Scala中的包的功能更加强大,使用也相对复杂些,下面我们学习Scala包的使用和注意事项。

2. Scala包的特点概述
  • 基本语法
package 包名
  • Scala包的三大作用(和Java一样)
  1. 区分相同名字的类
  2. 当类很多时,可以很好的管理类
  3. 控制访问范围
  • Scala中包名和源码所在的系统文件目录结构要可以不一致,但是编译后的字节码文件路径和包名会保持一致
3. Scala包注意事项和使用细节

1)scala进行package 打包时,可以有如下形式:
在这里插入图片描述
2)包也可以像嵌套类那样嵌套使用(包中有包), 这个在前面的第三种打包方式已经讲过了,在使用第三种方式时的好处是:程序员可以在同一个文件中,将类(class / object)、trait 创建在不同的包中,这样就非常灵活了
在这里插入图片描述
3)作用域原则:可以直接向上访问。即: Scala中子包中直接访问父包中的内容, 大括号体现作用域。(提示:Java中子包使用父包的类,需要import)。在子包和父包 类重名时,默认采用就近原则,如果希望指定使用某个类,则带上包名即可

package com.atguigu{
  //这个类就是在com.atguigu包下
  class User{
  }
  //这个类对象就是在Monster$ , 也在com.atguigu包下
  object Monster {
  }
  class Dog {
  }
  package scala {
    //这个类就是在com.atguigu.scala包下
    class User{
    }
    //这个Test 类对象
    object Test {
      def main(args: Array[String]): Unit = {
          //子类可以直接访问父类的内容
          var dog = new Dog()
          println("dog=" + dog)
          //在子包和父包 类重名时,默认采用就近原则.
          var u = new User()
          println("u=" + u)
          //在子包和父包 类重名时,如果希望指定使用某个类,则带上包路径
          var u2 = new com.atguigu.User()
          println("u2=" + u2)
      }
    }
  }
}

4)父包要访问子包的内容时,需要import对应的类等
在这里插入图片描述
5)可以在同一个.scala文件中,声明多个并列的package(建议嵌套的pakage不要超过3层)

6)包名可以相对也可以绝对,比如,访问BeanProperty的绝对路径是:_root_.scala.beans.BeanProperty ,在一般情况下:我们使用相对路径来引入包,只有当包名冲突时,使用绝对路径来处理

package com.atguigu.scala2
class Manager( var name : String ) {
  //第一种形式
  //@BeanProperty var age: Int = _
  //第二种形式, 和第一种一样,都是相对路径引入
  //@scala.beans.BeanProperty var age: Int = _
  //第三种形式, 是绝对路径引入,可以解决包名冲突
  @_root_. scala.beans.BeanProperty var age: Int = _
}
object TestBean {
  def main(args: Array[String]): Unit = {
    val m = new Manager("jack")
    println("m=" + m)
  }}
4. 包对象
  • 基本介绍:
    包可以包含类、对象和特质trait,但不能包含函数/方法或变量的定义。这是Java虚拟机的局限。为了弥补这一点不足,scala提供了包对象的概念来解决这个问题。
  • 包对象的应用案例
package com.atguigu {  
  //每个包都可以有一个包对象。你需要在父包(com.atguigu)中定义它,且名称与子包一样。
  package object scala {
    var name = "jack"
    def sayOk(): Unit = {
      println("package object sayOk!")
    }
  }
  package scala {
    class Test {
      def test() : Unit ={
        //这里的name就是包对象scala中声明的name
        println(name)
        sayOk()//这个sayOk 就是包对象scala中声明的sayOk
      }
    }
    object TestObj {
      def main(args: Array[String]): Unit = {
        val t  = new Test()
        t.test()
        //因为TestObje和scala这个包对象在同一包,因此也可以使用
        println("name=" + name)
      }}}}
  • 包对象的注意事项
    1)每个包都可以有一个包对象。你需要在父包中定义它
    2)包对象名称需要和包名一致,一般用来对包的功能补充

二. 包的可见性

1. Scala中包的可见性介绍:

在Java中,访问权限分为: public,private,protected和默认。在Scala中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。

object Testvisit {
  def main(args: Array[String]): Unit = {
    val  c = new Clerk()
    c.showInfo()
    Clerk.test(c)
  }}
class Clerk {
  var name : String = "jack"
  private var sal : Double = 9999.9
  def showInfo(): Unit = {
    println(" name " + name + " sal= " + sal)
  }}
object Clerk{
  def test(c : Clerk): Unit = {
    //这里体现出在伴生对象中,可以访问c.sal
    println("test() name=" + c.name + " sal= " + c.sal)
  }}
2. Scala中包的可见性和访问修饰符的使用

1)当属性访问权限为默认时,从底层看属性是private的,但是因为提供了xxx_$eq()[类似setter]/xxx()[类似getter] 方法,因此从使用效果看是任何地方都可以访问)
2)当方法访问权限为默认时,默认为public访问权限
3)private为私有权限,只在类的内部和伴生对象中可用
4)protected为受保护权限,scala中受保护权限比Java中更严格,只能子类访问,同包无法访问 (编译器)
5)在scala中没有public关键字,即不能用public显式的修饰属性和方法。
6)包访问权限(表示属性有了限制。同时包也有了限制),这点和Java不一样,体现出Scala包使用的灵活性。
在这里插入图片描述

三. 包的引入

1. Scala引入包基本介绍

Scala引入包也是使用import, 基本的原理和机制和Java一样,但是Scala中的import功能更加强大,也更灵活。

因为Scala语言源自于Java,所以java.lang包中的类会自动引入到当前环境中,而Scala中的scala包和Predef包的类也会自动引入到当前环境中,即其下面的类可以直接使用。

如果想要把其他包中的类引入到当前环境中,需要使用import语言。

2. Scala引入包的细节和注意事项

1)在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部,import语句的作用一直延伸到包含该语句的块末尾。这种语法的好处是:在需要时在引入包,缩小import 包的作用范围,提高效率。
在这里插入图片描述
2)Java中如果想要导入包中所有的类,可以通过通配符*,Scala中采用下 _

3)如果不想要某个包中全部的类,而是其中的几个类,可以采用选取器(大括号)
在这里插入图片描述
4)如果引入的多个包中含有相同的类,那么可以将不需要的类进行重命名进行区分,这个就是重命名
在这里插入图片描述
5)如果某个冲突的类根本就不会用到,那么这个类可以直接隐藏掉
在这里插入图片描述

四. 面向对象编程的三大特征

1. 基本介绍

面向对象编程有三大特征:封装、继承和多态

2. 封装介绍

封装(encapsulation)就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作

  • 封装的实现步骤
    1)将属性进行私有化
    2)提供一个公共的set方法,用于对属性判断并赋值 def setXxx(参数名 : 类型) : Unit = { //加入数据验证的业务逻辑 属性 = 参数名 }
    3)提供一个公共的get方法,用于获取属性的值 def getXxx() [: 返回类型] = {
    return 属性
    }

  • 快速入门案例
    在这里插入图片描述在这里插入图片描述

3. 继承介绍
  • Scala继承的基本语法
class 子类名 extends 父类名  { 类体 }
  • Scala继承快速入门
    编写一个Student 继承 Person的案例,体验一下Scala继承的特点
    在这里插入图片描述
4. 多态介绍
  • 基本介绍
    和java相似,参考java的即可
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值