4.1 访问修饰符

4.1.1 访问修饰符

Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。
如果没有指定访问修饰符,默认情况下,Scala 对象的访问级别都是 public。
Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员。

  • 用 private 关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类。
  • 对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。而在java中,用 protected关键字修饰的成员,除了定义了该成员的类的子类可以访问,同一个包里的其他类也可以进行访问。
  • Scala 中,如果没有指定任何的修饰符,则默认为 public。这样的成员在任何地方都可以被访问。

    4.1.2 作用域保护

    Scala中,访问修饰符可以通过使用限定词强调。格式为:
    private[x] 或 protected[x]
    这里的x指代某个所属的包、类或单例对象。如果写成private[x],读作”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private。
    这种技巧在横跨了若干包的大型项目中非常有用,它允许你定义一些在你项目的若干子包中可见但对于项目外部的客户却始终不可见的东西。例如:
    private[example] class Demo{}
    上述例子中,类 Demo被标记为 private[example] 就是说这个类对包含在 example包里的所有的类和对象可见。
    如果有一个类Vehicle 包含在example包中,从 Vehicle 对象里对 Demo的访问是被允许的,相反,所有在包 example 之外的代码都不能访问类 Demo。

    4.2 类和对象

    类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
    我们可以使用 new 关键字来创建类的对象。

    4.2.1 类的定义

  • Scala类的定义跟JAVA中类的定义基本是一样的。

  • Scala类不用public修饰,Scala类默认的访问修饰符是public。
  • scala默认属性是private的,而且也会默认生成共有的setter、getter方法。但是如果属性被显示声明为private,那么默认会生成private的getter、setter。
    • 用val修饰的变量是可读属性(引用地址不可变),默认getter方法。
    • 用var修饰的变量既默认有getter和setter方法。
  • 成员变量必须显式的初始化,然后根据初始化数据的类型推断,属性类型可以省略。也可以用“_”表示1个占位符,编译器会根据你变量的具体类型赋予相应的初始值。

【例】
1、编写Dog类
image.png
2、测试Dog类
image.png
执行测试方法say的结果:
image.png
3、属性调用测试

执行测试方法init的结果:
image.png

4.2.2 构造器

Scala中的每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起,称为类参数。
【例】
1、创建带类参数的类
image.png
2、测试带参数的类
image.png
执行测试方法say输出结果:
image.png

4.2.3 单例对象

在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的实现方法,那就是使用关键字 object。Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数。
当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类。类和它的伴生对象可以互相访问其私有成员。
【例】
1、创建单例对象
image.png
2、测试单例对象
image.png
执行测试方法say,输出结果:
image.png

4.3 继承

Scala继承一个基类跟Java很相似, 但我们需要注意以下几点:

  • 重写一个非抽象方法必须使用override修饰符。
  • 只有主构造函数才可以往基类的构造函数里写参数。
  • 在子类中重写超类的抽象方法时,你不需要使用override关键字。

Scala 使用 extends 关键字来继承一个类。继承会继承父类的所有属性和方法,Scala 只允许继承一个父类。
【例】
1、创建父类
image.png
2、创建子类
image.png
3、测试
image.png
执行测试方法test1,输出结果:
image.png

4.4 Trait(特征)

Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。
Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait。
【例】
1、创建接口
image.png
2、继承接口
image.png
3、测试
image.png
执行测试方法test2,输出结果:
image.png