Chuyển đến nội dung chính

Lớp và Đối tượng trong Scala

Trong hướng dẫn này, bạn sẽ tìm hiểu về các khái niệm nền tảng của lập trình hướng đối tượng trong Scala: Lớp và Đối tượng.
Đã cập nhật 5 thg 10, 2026  · 8 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

DataCamp gần đây đã ra mắt khóa học Scala đầu tiên: Giới thiệu về Scala. Hãy xem nhé!

Bạn cũng có thể xem các hướng dẫn sau:

Giới thiệu

sơ đồ các khái niệm OOP
Nguồn

Nói chung, Lập trình Hướng Đối tượng (OOP) bao gồm lớp và đối tượng, hướng tới việc mô phỏng các thực thể trong thế giới thực như tính đa hình, kế thừa.

OOP giúp phát triển nhanh hơn, tiết kiệm chi phí hơn và cải thiện khả năng bảo trì phần mềm. Lý do chính cho điều này là số lượng tính năng mà nó hỗ trợ; bạn có các lớp & đối tượng có thể dễ dàng tái sử dụng trong tương lai theo nhu cầu, trái ngược với một chương trình không có lớp & đối tượng. Điều này dẫn đến phần mềm chất lượng cao hơn, đồng thời có thể mở rộng với các phương thức và thuộc tính mới.

Giả sử bạn có một showroom ô tô; vài tháng lại có một mẫu xe mới ra mắt và để thông báo cho khách hàng về tên và tính năng của nó, bạn phải định nghĩa các phương thức, thuộc tính mới từ đầu. Tuy nhiên, nếu bạn có một chương trình hướng đối tượng với lớp car, tất cả những gì bạn cần thêm là một đối tượng cho chiếc xe mới, đối tượng này sẽ gọi các phương thức & thuộc tính của lớp với thông tin về chiếc xe.

Lớp có thể được xem như bản đại diện hay bản thiết kế cho các đối tượng. Lớp thường có các phương thức (hành vi) và thuộc tính riêng.

Thuộc tính là các thực thể riêng lẻ giúp phân biệt mỗi đối tượng với đối tượng khác và xác định các đặc điểm của đối tượng. Phương thức, mặt khác, giống như cách một hàm hoạt động trong lập trình. Chúng quyết định cách thể hiện (instance) của lớp vận hành. Chính nhờ các phương thức (hành vi) mà đối tượng có thể được thực hiện hành động lên chúng.

Nguồn

Hình trên giúp bạn hình dung rõ hơn về luồng của lập trình hướng đối tượng, hay cụ thể hơn, một lớp trông như thế nào. Trong hình, có một class car với các attributes: fuel, max speed, và có thể có thêm các thuộc tính như model, make, v.v. Nó có các methods khác nhau như refuel(), getFuel(), setSpeed(), và một số phương thức khác như change gear, start the engine, stop the engine, v.v.

Vì vậy, khi bạn nói về một chiếc xe cụ thể, bạn sẽ có một đối tượng, tức là một thể hiện của lớp.

Giờ hãy nói về lập trình hướng đối tượng trong Scala.

Lớp và Đối tượng trong Scala

Tương tự như C++ và Java, lập trình hướng đối tượng trong Scala gần như tuân theo cùng quy ước. Nó có khái niệm định nghĩa classes và objects và constructors trong lớp, và đó là tất cả về lập trình hướng đối tượng trong Scala.

Khai báo Lớp

class Class_name{
// methods and attributes
}

Lớp trong Scala được định nghĩa bằng từ khóa class theo sau là tên lớp, và thường tên lớp bắt đầu bằng chữ hoa. Có một vài từ khóa là tùy chọn nhưng có thể dùng trong khai báo lớp Scala như: class-name, nên bắt đầu bằng chữ hoa: superclass, tên lớp cha đi trước bởi từ khóa extend: traits, là danh sách phân tách bằng dấu phẩy được lớp triển khai và đi trước bởi từ khóa extend.

Một lớp trong Scala chỉ kế thừa một lớp cha, nghĩa là Scala không hỗ trợ đa kế thừa. Tuy nhiên, điều này có thể đạt được bằng cách sử dụng Traits.

Cuối cùng, thân của một lớp trong Scala được bao bởi dấu ngoặc nhọn {}.

// Name of the class is Car
class Car
{

    // Class variables
    var make: String = "BMW"
    var model: String = "X7"
    var fuel: Int = 40

    // Class method
    def Display()
    {
        println("Make of the Car : " + make);
        println("Model of the Car : " + model);
        println("Fuel capacity of the Car : " + fuel);
    }
}
object Main  
{

    // Main method
    def main(args: Array[String])  
    {

        // Class object
        var obj = new Car();
        obj.Display();
    }
}

Bạn có thể lưu đoạn mã trên với tên class.scala và chạy trên terminal bằng scala class.scala, và bạn sẽ thấy kết quả như bên dưới.

kết quả

Tuy nhiên, đoạn mã trên chưa tận dụng hết các ưu thế mà một chương trình hướng đối tượng có thể mang lại. Vì đầu ra của đoạn mã sẽ trả về cùng một kết quả dù bạn chạy bao nhiêu lần. Bạn đã định nghĩa các biến tĩnh trong lớp, và giá trị của các biến đó sẽ giữ nguyên, ngay cả khi bạn tạo ra vô số đối tượng mới. Kết luận là bạn không thể kỳ vọng nó cho bạn thông tin về một chiếc Mercedes Benz hay Ferrari.

Constructor trong Scala

Constructors chủ yếu dùng để khởi tạo trạng thái của đối tượng. Việc khởi tạo này diễn ra tại thời điểm tạo đối tượng và chỉ được gọi một lần.

Có hai loại constructor trong Scala: Primary và Auxiliary. Trong hướng dẫn này, bạn sẽ học về primary constructor (Nguồn: O'Reilly).

class Class_name(Parameter_list){
// methods, attributes
}

Primary constructor dùng chung thân với lớp và được tạo ngầm cùng với định nghĩa lớp. Nó bắt đầu tại phần định nghĩa lớp và bao trùm toàn bộ thân lớp. Ngoài ra, khi chỉ có một constructor trong chương trình Scala, nó được gọi là primary constructor. Một primary constructor có thể được định nghĩa với không, một, hoặc nhiều tham số.

Vậy, hãy lấy lại ví dụ trước, nhưng lần này bổ sung primary constructor vào và quan sát hiệu ứng.

Đồng thời, ở đây bạn sẽ học một tính năng mới của lớp, tức là một lớp có thể có nhiều đối tượng hay thể hiện, nhưng chúng độc lập với nhau.

// Name of the class is Car
class Car(make: String, model: String, fuel: Int)
{

    // Class method
    def Display()
    {
        println("Make of the Car : " + make);
        println("Model of the Car : " + model);
        println("Fuel capacity of the Car : " + fuel);
    }
}

object Main

{

    // Main method
    def main(args: Array[String])  
    {

        // Multiple Class object
        var obj1 = new Car("BMW", "X7", 40);
        var obj2 = new Car("Mercedes Benz", "S350D", 50);
        obj1.Display();
        obj2.Display();
    }
}

Hãy xem nhanh kết quả:

kết quả

Tuyệt vời phải không? Với sự hỗ trợ của constructor, bạn đã có thể tạo ra kết quả hiệu quả hơn.

Khai báo Đối tượng trong Scala

Khai báo đối tượng trong Scala cũng có thể được gọi là tạo thể hiện (instantiate) một lớp hoặc gọi một lớp. Tương tự như lớp, đối tượng cũng là một đơn vị nền tảng của lập trình hướng đối tượng.

Một đối tượng có thể gồm ba đặc trưng (Nguồn: GeeksforGeeks:

  • State: Các thuộc tính của đối tượng đại diện cho nó. Chúng cũng phản ánh các đặc tính của đối tượng.
  • Behavior: Các phương thức của đối tượng đại diện cho nó. Chúng phản ánh cách đối tượng phản hồi với các đối tượng khác.
  • Identity: Cung cấp tên duy nhất cho đối tượng và cho phép một đối tượng tương tác với các đối tượng khác.

Hãy coi Chó là một đối tượng và xem sơ đồ dưới đây cho danh tính, trạng thái và hành vi của nó.

sơ đồ
(Nguồn)

Tất cả các thể hiện hay đối tượng chia sẻ các thuộc tính và phương thức của lớp. Một lớp có thể có nhiều đối tượng, như bạn đã học ở đây. Tuy nhiên, trạng thái hay giá trị của mỗi đối tượng là duy nhất.

Cuối cùng, bạn sẽ viết một đoạn mã có primary constructor, biến lớp, thuộc tính và phương thức, tất cả kết hợp trong một mã duy nhất.

Dưới đây là hình minh họa các thành phần được kết hợp trong lớp Motorcycle.

các thành phần của lớp

Đoạn mã dưới khá dễ hiểu; ở mức khái quát, nó kiểm tra xem động cơ xe máy đang ở trạng thái on hay off. Ban đầu, động cơ ở trạng thái tắt và chương trình sẽ thông báo trạng thái của nó rồi bật lên.

class Motorcycle(make:String,color:String) {


       var engineState: Boolean = false;

       def startEngine() {
          if (engineState == true){
            println("The engine is already on.");
          }
          else {
            engineState = true
            println("The engine is now on.");
         }
       }

       def showAtts() {
         println("This motorcycle is a "+ color + " " + make);
         if (engineState == true){
           println("The engine is on.");
         }
         else{
            println("The engine is off.");
         }
      }

}
object Main
{
    def main (args: Array[String])
    {
        var m = new Motorcycle("BMW K 1600 GTL","White");
        println("Calling showAtts...");
        m.showAtts();
        println("------");
        println("Starting engine...");
        m.startEngine();
        println("------");
        println("Calling showAtts...");
        m.showAtts();
        println("------");
        println("Starting engine...");
        m.startEngine();
    }
}
sơ đồ

Chúc mừng!

Chúc mừng bạn đã hoàn thành hướng dẫn này.

Bây giờ bạn đã biết cách khai báo lớp và phương thức, tạo đối tượng, đặt thuộc tính của chúng và gọi các phương thức thể hiện trong Scala. Những khái niệm này sẽ hữu ích không chỉ trong Scala mà còn ở các ngôn ngữ lập trình khác.

Các khái niệm lập trình hướng đối tượng rất thú vị và đồng thời rất mạnh mẽ. Chúng mang lại một chiều kích mới cho mã của bạn, giúp tái sử dụng. Khi chương trình của bạn lớn dần, mã sẽ trở nên phức tạp hơn. Có rất nhiều nội dung trong các khái niệm OOP như kế thừa, đa hình, phương thức thể hiện. Một tính năng mạnh mẽ khác là Singleton. Các nguyên tắc thiết kế giúp giữ cho mã của bạn có cấu trúc và dễ đọc hơn. Để tìm hiểu thêm về mẫu thiết kế, hãy cân nhắc đọc cuốn sách này.

Vui lòng đặt câu hỏi liên quan đến hướng dẫn này trong phần bình luận bên dưới.

Cuối cùng, đừng quên tham gia khóa học Scala mới trên DataCamp, Giới thiệu về Scala.

Chủ đề
Scala

Tìm hiểu thêm về Scala

Khóa học

Introduction to Scala

3 giờ
27.2K
Begin your journey with Scala, a popular language for scalable applications and data engineering infrastructure.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm