Câu trả lời:
class C
định nghĩa một lớp, giống như trong Java hoặc C ++.object O
tạo một đối tượng singletonO
như thể hiện của một số lớp ẩn danh; nó có thể được sử dụng để giữ các thành viên tĩnh không liên quan đến các thể hiện của một số lớp.object O extends T
làm cho đối tượng O
trở thành một thể hiện của trait T
; sau đó bạn có thể vượt qua O
bất cứ nơi nào, một T
dự kiến.class C
, thì object C
là đối tượng đồng hành của lớp C
; lưu ý rằng đối tượng đồng hành không tự động là một thể hiện của C
.Cũng xem tài liệu Scala cho đối tượng và lớp .
object
là máy chủ của các thành viên tĩnhThông thường, bạn cần có một object
phương thức và các giá trị / biến có sẵn mà không cần phải khởi tạo một thể hiện của một số lớp. Việc sử dụng này có liên quan chặt chẽ với static
các thành viên trong Java.
object A {
def twice(i: Int): Int = 2*i
}
Sau đó bạn có thể gọi phương thức trên bằng cách sử dụng A.twice(2)
.
Nếu twice
là thành viên của một số lớp A
, thì bạn cần phải tạo một ví dụ trước:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Bạn có thể thấy mức độ dư thừa này như thế nào, vì twice
không yêu cầu bất kỳ dữ liệu cụ thể nào.
object
như một ví dụ đặc biệtBạn cũng có thể sử dụng object
chính nó như một số thể hiện đặc biệt của một lớp hoặc đặc điểm. Khi bạn làm điều này, đối tượng của bạn cần mở rộng một số trait
để trở thành một thể hiện của một lớp con của nó.
Hãy xem xét các mã sau đây:
object A extends B with C {
...
}
Tuyên bố này trước tiên tuyên bố một lớp ẩn danh (không thể truy cập) mở rộng cả hai B
và C
, và khởi tạo một thể hiện duy nhất của lớp này có tên A
.
Điều này có nghĩa là A
có thể được truyền cho các hàm mong đợi các đối tượng thuộc loại B
hoặc C
, hoặc B with C
.
object
Cũng tồn tại một số tính năng đặc biệt của các đối tượng trong Scala. Tôi khuyên bạn nên đọc tài liệu chính thức .
def apply(...)
cho phép cú pháp không có tên phương thức thông thường của A(...)
def unapply(...)
cho phép tạo các trình trích xuất khớp mẫu tùy chỉnhCommerce
lớp, nhưng JVM và ngôn ngữ Java sẽ. (Đó là cách bạn có thể làm object Foo{ def main(args:Seq[String]) }
và mong đợi chương trình chạy.)
A class
là một định nghĩa, một mô tả. Nó định nghĩa một loại về phương thức và thành phần của các loại khác.
An object
là một singleton - một thể hiện của một lớp được đảm bảo là duy nhất. Đối với mỗi object
trong mã, một lớp ẩn danh được tạo, kế thừa từ bất kỳ lớp nào bạn khai báo object
để thực hiện. Lớp này không thể được nhìn thấy từ mã nguồn Scala - mặc dù bạn có thể nhận được nó thông qua sự phản chiếu.
Có một mối quan hệ giữa object
và class
. Một đối tượng được cho là đối tượng đồng hành của một lớp nếu chúng có cùng tên. Khi điều này xảy ra, mỗi người có quyền truy cập vào các phương thức private
hiển thị khác. Những phương pháp này không được nhập tự động, mặc dù. Bạn phải nhập chúng một cách rõ ràng hoặc tiền tố chúng với tên lớp / đối tượng.
Ví dụ:
class X {
// class X can see private members of object X
// Prefix to call
def m(x: Int) = X.f(x)
// Import and use
import X._
def n(x: Int) = f(x)
private def o = 2
}
object X {
private def f(x: Int) = x * x
// object X can see private members of class X
def g(x: X) = {
import x._
x.o * o // fully specified and imported
}
}
def f(x: X) = ???
, sau đó nó sẽ có thể gọi các phương thức riêng trên x
, của lớp đồng hành X
.
Một đối tượng có chính xác một trường hợp (bạn không thể gọi new MyObject
). Bạn có thể có nhiều phiên bản của một lớp.
Đối tượng phục vụ các mục đích tương tự (và một số bổ sung) như các phương thức và trường tĩnh trong Java.
Như đã được giải thích bởi nhiều người, object
định nghĩa một trường hợp đơn lẻ. Một điều trong các câu trả lời ở đây mà tôi tin là còn sót lại là object
phục vụ một số mục đích.
Nó có thể là đối tượng đồng hành với a class
/ trait
, chứa những gì có thể được coi là phương thức tĩnh hoặc phương thức tiện lợi.
Nó có thể hoạt động giống như một mô-đun, chứa các loại và định nghĩa liên quan / công ty con, v.v.
Nó có thể thực hiện một giao diện bằng cách mở rộng một class
hoặc một hoặc nhiều trait
s.
Nó có thể đại diện cho một trường hợp sealed trait
không chứa dữ liệu. Về mặt này, nó thường được coi là chính xác hơn là case class
không có tham số. Trường hợp đặc biệt của một người sealed trait
chỉ có người case object
thực hiện ít nhiều là phiên bản Scala của một enum.
Nó có thể đóng vai trò là bằng chứng cho implicit
logic -driven.
Nó giới thiệu một loại singleton.
Đó là một cấu trúc rất mạnh mẽ và chung chung. Điều có thể rất khó hiểu với những người mới bắt đầu Scala là cùng một cấu trúc có thể có những cách sử dụng rất khác nhau. Và một object
có thể phục vụ nhiều trong số những sử dụng khác nhau cùng một lúc, điều này có thể còn khó hiểu hơn.
Xác định một đối tượng trong Scala giống như định nghĩa một lớp trong Java chỉ có các phương thức tĩnh. Tuy nhiên, trong Scala, một đối tượng có thể mở rộng một siêu lớp khác, thực hiện các giao diện và được truyền xung quanh như thể nó là một thể hiện của một lớp. (Vì vậy, nó giống như các phương thức tĩnh trên một lớp nhưng tốt hơn).
Sự khác biệt chính thức -
Sự khác biệt trong cách sử dụng:
object
. Bạn có thể sử dụng nó có hoặc không có lớp liên quan. Trong trường hợp đầu tiên, nó được gọi là một đối tượng đồng hành. Bạn phải:
Để tạo một chương trình, bạn nên sử dụng phương thức chính object
, không phải trong class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Bạn cũng có thể sử dụng nó khi bạn sử dụng đối tượng singleton trong java.
Các đối tượng từ khóa tạo ra một kiểu singleton mới, mà là giống như một lớp học mà chỉ có một tên là trường hợp duy nhất. Nếu bạn quen thuộc với Java, việc khai báo một đối tượng trong Scala rất giống với việc tạo một thể hiện mới của một lớp ẩn danh.
Scala không có tương đương với Java tĩnh từ khóa, và một đối tượng thường được sử dụng trong Scala, nơi bạn có thể sử dụng một lớp với các thành viên tĩnh trong Java.
Trong scala, không có static
khái niệm. Vì vậy, scala tạo một đối tượng singleton để cung cấp điểm vào cho việc thực hiện chương trình của bạn. Nếu bạn không tạo đối tượng singleton, mã của bạn sẽ biên dịch thành công nhưng sẽ không tạo ra bất kỳ đầu ra nào. Các phương thức được khai báo bên trong Singleton Object có thể truy cập được trên toàn cầu. Một đối tượng singleton có thể mở rộng các lớp và đặc điểm.
Ví dụ đối tượng Scala Singleton
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
Đầu ra:
Hello, This is Singleton Object
Trong scala, khi bạn có một lớp có cùng tên với đối tượng singleton, nó được gọi là lớp đồng hành và đối tượng singleton được gọi là đối tượng đồng hành.
Cả lớp đồng hành và đối tượng đồng hành của nó đều phải được định nghĩa trong cùng một tệp nguồn.
Ví dụ về đối tượng đồng hành Scala
class ComapanionClass{
def hello(){
println("Hello, this is Companion Class.")
}
}
object CompanoinObject{
def main(args:Array[String]){
new ComapanionClass().hello()
println("And this is Companion Object.")
}
}
Đầu ra:
Hello, this is Companion Class.
And this is Companion Object.
Trong scala, một lớp có thể chứa:
1. Thành viên dữ liệu
2. Phương thức thành viên
3. Khối xây dựng
4. Lớp lồng nhau
5. Thông tin siêu hạng, v.v.
Bạn phải khởi tạo tất cả các biến thể hiện trong lớp. Không có phạm vi mặc định. Nếu bạn không chỉ định phạm vi truy cập, nó là công khai. Phải có một đối tượng trong đó phương thức chính được xác định. Nó cung cấp điểm khởi đầu cho chương trình của bạn. Ở đây, chúng tôi đã tạo ra một ví dụ về lớp.
Ví dụ mẫu của Scala
class Student{
var id:Int = 0; // All fields must be initialized
var name:String = null;
}
object MainObject{
def main(args:Array[String]){
var s = new Student() // Creating an object
println(s.id+" "+s.name);
}
}
Tôi xin lỗi, tôi đã quá muộn nhưng tôi hy vọng nó sẽ giúp bạn.
Lớp Scala giống như Lớp Java nhưng scala không cung cấp cho bạn bất kỳ phương thức nhập nào trong lớp, giống như phương thức chính trong java. Phương thức chính liên quan đến từ khóa đối tượng. Bạn có thể nghĩ từ khóa đối tượng là tạo một đối tượng đơn lẻ của một lớp được định nghĩa ngầm.
thêm thông tin kiểm tra lớp bài viết này và từ khóa đối tượng trong lập trình scala
Một lớp cũng giống như bất kỳ lớp nào khác trong các ngôn ngữ khác. Bạn định nghĩa lớp giống như bất kỳ ngôn ngữ nào khác với một số khác biệt cú pháp.
class Person(val name: String)
val me = new Person("My name")
Tuy nhiên, đối tượng là một lớp chỉ có một đối tượng. Điều này làm cho nó thú vị vì nó có thể được sử dụng để tạo các thành viên tĩnh của một lớp bằng cách sử dụng đối tượng đồng hành . Đối tượng đồng hành này có quyền truy cập vào các thành viên riêng của định nghĩa lớp và nó có cùng tên với lớp bạn đang xác định.
class Person(var name: String) {
import Person._
def hi(): String = sayHello(name)
}
object Person {
private def sayHello(name: String): String = "Hello " + name
}
val me = new Person("My name")
me.hi()
Ngoài ra, điểm đáng chú ý là lớp đối tượng được tạo ra một cách lười biếng, đó là một điểm quan trọng khác. Vì vậy, những điều này không được khởi tạo trừ khi chúng là cần thiết trong mã của chúng tôi.
Nếu bạn đang xác định việc tạo kết nối cho JDBC, bạn có thể tạo chúng bên trong đối tượng để tránh trùng lặp giống như chúng ta làm trong Java với các đối tượng đơn lẻ.
Nếu bạn đến từ nền java, khái niệm lớp trong scala tương tự như Java, nhưng lớp trong scala không chứa các thành viên tĩnh.
Các đối tượng trong scala là loại singleton mà bạn gọi các phương thức bên trong nó bằng tên đối tượng, trong đối tượng scala là một từ khóa và trong đối tượng java là một thể hiện của lớp