🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 🧱 类 (Class)

2. 🧩 对象 (Object)

3. 🔗 类与对象的区别和联系

4. ⚙️ 其他重要特性

总结


img

Scala 作为一门​​支持面向对象和函数式编程​​的多范式语言,其“类”和“对象”的概念是核心基础。它们与 Java 有相似之处,但也有着独特的设计哲学和语法特性。

1. 🧱 类 (Class)

类是创建对象的蓝图或模板,定义了对象的属性和行为。

  • ​定义类​​:使用 class 关键字。

    class Point(var x: Int, var y: Int) {
      def move(dx: Int, dy: Int): Unit = {
        x += dx
        y += dy
        println(s"x 的坐标点: $x")
        println(s"y 的坐标点: $y")
      }
    }

    Scala 中的类默认具有公有可见性,一个源文件可以包含多个类。

  • ​字段与方法​​:

    • ​字段​​(成员变量):使用 val(不可变,只生成 getter)或 var(可变,生成 getter 和 setter)定义,用于保存对象的状态。
    • ​方法​​(成员函数):使用 def 定义,包含可执行代码,用于对数据进行运算。Scala 方法的参数默认是 val 类型的。
  • ​构造器​​:

    • ​主构造器​​:参数直接放在类名之后 ( )。整个类体中的语句(除了字段和方法定义)都是主构造器的一部分。构造器参数前加 val/var 会使其成为类的字段,否则仅作为类内部可访问的参数。
    • ​辅助构造器​​:名称为 this,第一个语句必须是调用主构造器或其他辅助构造器。
    class Person(val name: String, var age: Int) {
      // 主构造器
      def this(name: String) = {
        this(name, 0) // 调用主构造器
        println("辅助构造器被调用")
      }
    }
  • ​访问修饰符​​:

    • private:成员仅在​​当前类内部​​可访问。伴生对象可以访问其伴生类的私有成员。
    • protected:成员在​​当前类及其子类​​中可访问。
    • ​默认​​(无修饰符):公有访问级别。

2. 🧩 对象 (Object)

Scala 没有静态成员,取而代之的是​​单例对象 (Singleton Object)​​。

  • ​定义对象​​:使用 object 关键字。对象在第一次被访问时初始化。

    object IdFactory {
      private var counter = 0
      def create(): Int = {
        counter += 1
        counter
      }
    }
    val newId = IdFactory.create() // 调用单例对象中的方法
  • ​伴生对象 (Companion Object)​​:与​​类同名​​且定义在​​同一个源文件​​中的单例对象。类和它的伴生对象可以互相访问对方的私有成员。

    class Account {
      val id = Account.newUniqueNumber() // 访问伴生对象的私有方法
      private var balance = 0.0
    }
    
    object Account { // Account 类的伴生对象
      private var lastNumber = 0
      private def newUniqueNumber() = { lastNumber += 1; lastNumber }
    }
  • ​应用程序对象​​:Scala 程序的入口。一种方式是定义包含 main 方法的对象;另一种更简洁的方式是让对象扩展 App 特质。

    object MyApp extends App {
      println("Hello, World!")
    }
  • ​apply 方法​​:在伴生对象中定义 apply 方法,常用于构造类的实例,从而可以省略 new 关键字。

    class Person(val name: String)
    object Person {
      def apply(name: String): Person = new Person(name)
    }
    val p = Person("Alice") // 等价于 new Person("Alice")

3. 🔗 类与对象的区别和联系

特性 类 (Class) 对象 (Object)
​关键字​ class object
​实例化​ 使用 new 创建多个实例 单例,无需 new,直接通过对象名访问
​主要用途​ 创建对象的模板,封装数据和行为 工具方法集合、工厂模式、程序入口、伴生对象
​静态成员​ Scala 类中无静态成员概念 充当静态成员的容器
​伴生关系​ 可与同名对象形成伴生关系 可与同名类形成伴生关系

4. ⚙️ 其他重要特性

  • ​特质 (Trait)​​:类似于 Java 中的接口,但可以包含字段和方法的实现。支持多重继承,用于共享接口和字段。
  • ​样例类 (Case Class)​​:使用 case 关键字定义的类,编译器会自动为其生成伴生对象、apply 方法、不可变字段的访问器以及有用的方法如 toString, equals, hashCode 等,常用于模式匹配和不可变数据建模。
    case class Message(sender: String, content: String)
    val msg = Message("Alice", "Hello!") // 无需 new

总结

Scala 的​​类​​是创建实例的蓝图,通过主构造器和辅助构造器初始化,通过字段和方法定义状态和行为。​​对象​​主要用于替代静态成员,实现工具类、工厂模式和应用入口。​​伴生对象​​是一个特殊且强大的概念,它与同名类紧密协作,能够互相访问私有成员。理解类和对象及其相互关系,是掌握 Scala 面向对象编程的基础。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐