Sự khác biệt giữa các Lớp, Đối tượng và Cá thể


Câu trả lời:


86

Java (và bất kỳ ngôn ngữ lập trình nào khác) được mô hình hóa theo kiểugiá trị . Ở cấp độ lý thuyết, một giá trị là một đại diện cho một số lượng tử thông tin và một loại là một tập hợp các giá trị. Khi chúng ta nói giá trị X là một thể hiện của kiểu Y, chúng ta chỉ đơn giản nói rằng X là một thành viên của tập các giá trị kiểu Y.

Vì vậy, đó là những gì thuật ngữ "cá thể" thực sự có nghĩa: nó mô tả một mối quan hệ không phải là một sự vật.

Hệ thống kiểu của ngôn ngữ lập trình Java hỗ trợ hai kiểu, kiểu nguyên thủykiểu tham chiếu . Các kiểu tham chiếu được chia thành các lớpkiểu mảng . Một đối tượng Java là một thể hiện của kiểu tham chiếu.

Một đối tượng là một cá thể lớp hoặc một mảng. ( JLS 4.3.1 )

Đó là kiểu xem lý thuyết.

Trong thực tế, hầu hết các nhà phát triển Java coi các từ "instance" và "object" là các từ đồng nghĩa. (Và điều đó bao gồm cả tôi, tôi đang cố gắng giải thích nhanh điều gì đó.) Và hầu hết các nhà phát triển sử dụng từ "giá trị" thay vì "thể hiện" để chỉ một thể hiện của kiểu nguyên thủy.


3
Tôi thực sự đánh giá cao câu trả lời của bạn, thưa ông, và tôi gần như đã hiểu, chỉ còn một câu hỏi nữa. Chúng ta nói- "Bất cứ khi nào trình biên dịch chạm vào phương thức khởi tạo đối số 0, nó sẽ tạo ra một thể hiện của một lớp.". Trong bối cảnh này, cái gì thực sự được tạo ra một thể hiện hay một đối tượng? Một đối tượng mà tôi đoán và chúng tôi sử dụng từ "instance" như một từ đồng nghĩa. Nhưng nó sẽ tốt hơn, nếu bạn xác nhận nó tốt hơn.
Pranjut

3
@Ryan: Về cơ bản là có: nó đang tạo một Đối tượng là một thể hiện của Lớp được đề cập. (. Nhưng lưu ý rằng câu trích dẫn được nói "thể hiện của một lớp" thay vì chỉ "dụ" ... do đó, tác giả không thực sự sử dụng "dụ" như một từ đồng nghĩa ở đây)
Stephen C

1
@RuneFS - "mô hình hóa" mà tôi đang nói đến không phải là về đại diện. Đó là lý thuyết. Đúng vậy, trong một số ngôn ngữ, có các đối tượng biểu thị kiểu hoặc thậm chí cho phép bạn liệt kê tất cả các trường hợp của một kiểu. Nhưng những thuộc tính đó làm tăng thêm "mô hình hóa" chung chung thay vì làm mất hiệu lực của nó.
Stephen C

1
@RuneFS - Không ... Tôi đang nói về "lý thuyết kiểu". Nó là một nhánh của toán học. Nó độc lập với công nghệ được sử dụng để chạy các chương trình. Lý thuyết loại gần nhất với tính toán là giải tích lambda. (Nếu bạn đang quan tâm, cố gắng và có được giữ của một bản sao của "các loại và Ngôn ngữ lập trình" của Benjamin C. Pierce.)
Stephen C

1
Bạn đang mắc phải sai lầm tương tự như user2390183. Bạn đang coi các biến là "tên". Họ không phải. Các biến là "chủ sở hữu tham chiếu" chứa tham chiếu đến các đối tượng. Các đối tượng không có tên nội tại. Các tham chiếu là thứ gần nhất với "tên" của một đối tượng, ngoại trừ việc chúng không có một biểu diễn cố định. (Các GC có thể di chuyển một đối tượng mà thay đổi các mẫu bit sử dụng để đại diện cho tham khảo.)
Stephen C

96

Một lớp là một bản thiết kế mà bạn sử dụng để tạo các đối tượng . Một đối tượng là một thể hiện của một lớp - đó là một 'thứ' cụ thể mà bạn đã tạo ra bằng một lớp cụ thể. Vì vậy, 'object' và 'instance' giống nhau, nhưng từ 'instance' chỉ ra mối quan hệ của một đối tượng với lớp của nó.

Điều này rất dễ hiểu nếu bạn nhìn vào một ví dụ. Ví dụ, giả sử bạn có một lớp học House. Ngôi nhà của chính bạn là một đối tượng và là một thể hiện của lớp House. Ngôi nhà của em gái bạn là một đối tượng khác (một thể hiện khác của lớp House).

// Class House describes what a house is
class House {
    // ...
}

// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();

Lớp Housemô tả khái niệm về ngôi nhà là gì, và có những ngôi nhà cụ thể, cụ thể là các đối tượng và cá thể của lớp House.

Lưu ý: Điều này hoàn toàn giống trong Java như trong tất cả các ngôn ngữ lập trình hướng đối tượng.


class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new();
Suraj Jain

myHouse và myCar là các đối tượng myHouse là một thể hiện của House (liên hệ Object-myHouse với Class-House của nó) myCar là một thể hiện của Car. Điều này có đúng không, hãy xem câu trả lời trên của user2390183 có đúng hay không?
Suraj Jain

29

Một lớp về cơ bản là một định nghĩa và chứa mã của đối tượng. Một đối tượng là một thể hiện của một lớp

ví dụ nếu bạn nói

String word = new String();

lớp là lớp String, nó mô tả từ đối tượng (thể hiện).

Khi một lớp được khai báo, không có bộ nhớ nào được cấp phát nên lớp chỉ là một khuôn mẫu.

Khi đối tượng của lớp được khai báo, bộ nhớ sẽ được cấp phát.


Ý của bạn là các đối tượng và cá thể giống nhau?
Pranjut

Cảm ơn david cho liên kết. Từ các chủ đề tôi nhận được này Mọi thứ trong thế giới thực có trạng thái và hành vi đều có thể được gọi là "đối tượng". Và để phân loại các đối tượng này, chúng ta sử dụng lớp (Lớp là bản thiết kế mà từ đó các đối tượng riêng lẻ được tạo ra). Và nó nói rằng, các đối tượng của lớp là các cá thể. Bây giờ xin ai đó cho tôi biết sự khác biệt giữa đối tượng và cá thể là gì?
Pranjut

@Mustafa: Tôi xin lỗi vì mâu thuẫn với bạn, nhưng theo JLS, một mảng cũng là một đối tượng trong Java. Và bạn sẽ thấy rằng JLS hoàn toàn không định nghĩa thuật ngữ 'instance'. Hãy xem câu trả lời của tôi.
Stephen C

@Ryan: Hãy xem câu trả lời của tôi để biết sự phân biệt giữa "instance" và "object". Câu trả lời và nhận xét của @ Mustafa là (IMO) gây hiểu lầm.
Stephen C

@mustafabar - "Khi một lớp được khai báo, không có bộ nhớ nào được cấp phát nên lớp chỉ là một khuôn mẫu." - Và điều này cũng không đúng. Bộ nhớ được cấp cho (ít nhất) đại diện cho các staticbiến của lớp. (. Và đối với những thứ khác quá có liên quan đến các loại bản sắc của lớp)
Stephen C

13

Tôi thích lời giải thích của Jesper về mặt giáo dân

Bằng cách ứng biến các ví dụ từ câu trả lời của Jesper,

class House {
// blue print for House Objects
}

class Car {
// blue print for Instances of Class Car 
}

House myHouse = new House();
Car myCar = new Car();

myHouse và myCar là các đối tượng

myHouse là một thể hiện của House (liên quan Object-myHouse với Class-House của nó) myCar là một thể hiện của Car

Nói ngắn gọn

"myHouse là một thể hiện của Class House" cũng giống như nói "myHouse là một Object của type House"


6

Lớp là Kiểu dữ liệu, Bạn sử dụng kiểu này để tạo đối tượng.

  • Đối tượng là Lôgic nhưng đối tượng là Vật lý. Phương tiện vật lý chiếm một số bộ nhớ.

  • Chúng ta có thể tạo một thể hiện cho lớp trừu tượng cũng như cho giao diện, nhưng chúng ta không thể tạo một
    đối tượng cho chúng.

  • Đối tượng là thể hiện của lớp và thể hiện có nghĩa là đại diện của lớp tức là đối tượng.

  • Phiên bản đề cập đến Tham chiếu của một đối tượng.

  • Đối tượng thực sự đang trỏ đến địa chỉ bộ nhớ của thể hiện đó.

  • Bạn không thể chuyển đối tượng qua các lớp nhưng bạn có thể chuyển đối tượng qua các lớp

  • Bạn không thể lưu trữ một phiên bản nhưng bạn có thể lưu trữ một đối tượng

  • Một đối tượng có thể có nhiều hơn một thể hiện.

  • Đối tượng sẽ có cả định nghĩa lớp và định nghĩa đối tượng, trong đó đối tượng sẽ chỉ có định nghĩa đối tượng.

Cú pháp của đối tượng:

 Classname var=new Classname();

Nhưng đối với việc tạo ví dụ, nó chỉ trả về một con trỏ tham chiếu đến một đối tượng, cú pháp là:

 Classname varname;

3

Trong java, các đối tượng được tạo trên bộ nhớ heap. Chúng yêu cầu tham chiếu phải được trỏ và sử dụng trong ứng dụng của chúng tôi. Tham chiếu có vị trí bộ nhớ của đối tượng mà chúng ta có thể sử dụng các đối tượng trong ứng dụng của mình. Tóm lại, một tham chiếu không có gì khác ngoài tên của biến lưu trữ địa chỉ của đối tượng được khởi tạo trên một vị trí bộ nhớ.

An instancelà một thuật ngữ chung cho object. FYI, Objectlà một lớp học.

Ví dụ,

Class A{

}

A ref = new A();

Đối với đoạn mã trên, ref là tham chiếu cho một đối tượng của lớp A được tạo trên heap.


3

Thành thật mà nói, tôi cảm thấy thoải mái hơn với các định nghĩa trên blog Alfred :

Đối tượng : các đối tượng trong thế giới thực có 2 đặc điểm chính, trạng thái và hành vi. Con người có trạng thái (tên, tuổi) và hành vi (chạy, ngủ). Xe có trạng thái (tốc độ hiện tại, số hiện tại) và hành vi (đạp phanh, chuyển số). Các đối tượng phần mềm tương tự về mặt khái niệm với các đối tượng trong thế giới thực: chúng cũng bao gồm trạng thái và hành vi liên quan. Một đối tượng lưu trữ trạng thái của nó trong các trường và thể hiện hành vi của nó thông qua các phương thức.

Lớp : là một “khuôn mẫu” / “bản thiết kế” được sử dụng để tạo các đối tượng. Về cơ bản, một lớp sẽ bao gồm trường, trường tĩnh, phương thức, phương thức tĩnh và phương thức khởi tạo. Trường được sử dụng để giữ trạng thái của lớp (ví dụ: tên của đối tượng Sinh viên). Phương thức được sử dụng để biểu diễn hành vi của lớp (ví dụ: cách một đối tượng Sinh viên sẽ đứng lên). Constructor được sử dụng để tạo một Phiên bản mới của Lớp.

Cá thể : Một cá thể là một bản sao duy nhất của một Lớp đại diện cho một Đối tượng. Khi một thể hiện mới của một lớp được tạo, JVM sẽ cấp phát một vùng bộ nhớ cho thể hiện lớp đó.

Cho ví dụ tiếp theo:

public class Person {
    private int id;
    private String name;
    private int age;

    public Person (int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        return true;
    }

    public static void main(String[] args) {
        //case 1
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);

        //case 2
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
    }
}

Đối với trường hợp 1, có hai trường hợp của lớp Person, nhưng cả hai trường hợp đều đại diện cho cùng một đối tượng.

Đối với trường hợp 2, có hai thể hiện của lớp Person, nhưng mỗi thể hiện đại diện cho một đối tượng khác nhau.

Vì vậy, lớp, đối tượng và cá thể là những thứ khác nhau. Đối tượng và trường hợp không phải là từ đồng nghĩa như được gợi ý trong câu trả lời được chọn là câu trả lời đúng.


2

Nếu bạn có một chương trình mô hình ô tô, bạn có một lớp đại diện cho ô tô, vì vậy trong Code bạn có thể nói:

Car someCar = new Car();

someCar bây giờ là một phiên bản của Class Car. Nếu chương trình được sử dụng tại một tiệm sửa chữa và someCar đại diện cho chiếc xe của bạn trong hệ thống của họ, thì chiếc xe của bạn là đối tượng.

Vì vậy, xe là một lớp mà có thể đại diện cho bất kỳ someCar xe thế giới thực là một thể hiện của lớp Car và someCare đại diện cho một đối tượng thực tế đời sống (xe của bạn)

tuy nhiên trường hợp và đối tượng thường được sử dụng thay thế cho nhau khi thảo luận về mã hóa


1
Nói một cách chính xác someCarlà tham chiếu đến một phiên bản Xe hơi. Bản thân cá thể không có tên.
Joachim Sauer

2

Bất kỳ loại dữ liệu nào mà máy tính của bạn lưu trữ và xử lý đều ở dạng biểu diễn cơ bản nhất của nó là một hàng bit. Cách các bit đó được diễn giải được thực hiện thông qua các kiểu dữ liệu. Các kiểu dữ liệu có thể là nguyên thủy hoặc phức tạp. Kiểu dữ liệu ban đầu là - ví dụ - int hoặc double. Chúng có độ dài cụ thể và cách diễn giải cụ thể. Trong trường hợp là số nguyên, thường bit đầu tiên được sử dụng cho dấu hiệu, các bit khác được sử dụng cho giá trị.

Các kiểu dữ liệu phức tạp có thể là sự kết hợp của các kiểu dữ liệu nguyên thủy và các kiểu dữ liệu phức tạp khác và được gọi là "Lớp" trong Java.

Bạn có thể định nghĩa kiểu dữ liệu phức tạp PeopleName bao gồm hai Chuỗi được gọi là họ và tên. Mỗi chuỗi trong Java là một kiểu dữ liệu phức tạp khác. Đổi lại, các chuỗi được thực thi (có thể) bằng cách sử dụng kiểu dữ liệu nguyên thủy char mà Java biết chúng cần bao nhiêu bit để lưu trữ và cách diễn giải chúng.

Khi bạn tạo một thể hiện của kiểu dữ liệu, bạn sẽ nhận được một đối tượng và máy tính của bạn dành một số bộ nhớ cho nó và ghi nhớ vị trí của nó cũng như tên của đối tượng đó. Một phiên bản của PeopleName trong bộ nhớ sẽ chiếm không gian của hai biến Chuỗi cộng thêm một chút cho việc ghi sổ. Một số nguyên chiếm 32 bit trong Java.

Các kiểu dữ liệu phức tạp có thể có các phương thức được gán cho chúng. Các phương thức có thể thực hiện các hành động trên các đối số của chúng hoặc trên trường hợp của kiểu dữ liệu mà bạn gọi phương thức này. Nếu bạn có hai phiên bản PeopleName được gọi là p1 và p2 và bạn gọi phương thức p1.getFirstName (), nó thường trả về tên của người đầu tiên nhưng không trả về tên của người thứ hai.


2

Khái niệm đằng sau các lớp và đối tượng là đóng gói logic thành một đơn vị lập trình duy nhất. Các lớp là bản thiết kế của các đối tượng được tạo ra.

Dưới đây là một ví dụ về một lớp đại diện cho Xe hơi:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Bạn có thể tạo các phiên bản của đối tượng Xe như sau:

Car audi = new Car();
Car toyota = new Car();

Tôi đã lấy ví dụ từ hướng dẫn này


2

Lớp : Cấu trúc

Đối tượng : Biểu hiện vật lý

Phiên bản : mỗi đối tượng được tạo từ lớp

Tham khảo : Địa chỉ của Đối tượng


1

Lớp học

  • Nó tồn tại logic, tức là không có không gian bộ nhớ nào được cấp phát khi nó được tạo.

  • Nó là một tập hợp các đối tượng.

  • Một lớp có thể được coi là một bản thiết kế để tạo ra các đối tượng.

    • Nó được tạo bằng từ khóa class

    • Một lớp xác định các phương thức và thành viên dữ liệu sẽ được sở hữu bởi Đối tượng.


Vật

  • Nó tồn tại vật lý, tức là không gian bộ nhớ được cấp phát khi nó được tạo ra.

  • Nó là một thể hiện của một lớp.

  • Một đối tượng là một thực thể duy nhất chứa các thành viên dữ liệu và các hàm thành viên cùng nhau trong ngôn ngữ OOP.

    • Nó được tạo bằng từ khóa mới

    • Một đối tượng chỉ định việc triển khai các phương thức và các giá trị sẽ được sở hữu bởi các thành viên dữ liệu trong lớp.


1
Không gian có thể được cấp phát khi một lớp được "tạo". Không gian là bắt buộc cho bất kỳ biến tĩnh nào được xác định bởi lớp. (Và "logic" so với "vật lý" đang kéo dài nó, vì biểu diễn đối tượng chỉ là các mẫu bit giúp ích trong một số thiết bị nhớ.)
Stephen C

@StephenC sau đó có thể là sự khác biệt nào?

Xem câu trả lời của tôi. Câu hỏi này không thể được trả lời đúng bằng cách chỉ nói về sự khác biệt.
Stephen C

0

Một lớp là một bản thiết kế cần thiết để tạo một đối tượng (= instance).

Sự khác biệt giữa một đối tượng và một thể hiện là, một đối tượng là một sự vật và một thể hiện là một quan hệ.

Nói cách khác, instance mô tả mối quan hệ của một đối tượng với lớp mà đối tượng đó được tạo ra.


-1

Định nghĩa "Đối tượng là một thể hiện của một lớp", là sai về mặt khái niệm, nhưng đúng theo cách triển khai. Thực ra các tính năng hướng đối tượng được lấy từ thực tế cuộc sống, nhằm tập trung tâm trí của người lập trình từ nhiều đến ít. Trong cuộc sống thực, các lớp học được thiết kế để quản lý đối tượng, ví dụ như con người chúng ta có đẳng cấp, tôn giáo, quốc tịch và nhiều hơn thế nữa. Những giai cấp, tôn giáo, dân tộc là những giai cấp và không tồn tại nếu không có con người. Nhưng trong thực thi không tồn tại các đối tượng không có lớp. Đối tượng- Đối tượng là một thực thể rời rạc có một số thuộc tính được xác định rõ. Ở đây rời rạc có nghĩa là một cái gì đó làm cho nó trở nên độc đáo so với cái khác. Thuộc tính được xác định rõ có ý nghĩa trong một số ngữ cảnh. Class- Phân loại đối tượng có một số hành vi chung hoặc các đối tượng của một số loại phổ biến.


-1

Mặc dù các câu trả lời trên là đúng, nhưng một cách khác để suy nghĩ về Lớp và Đối tượng là sử dụng các ví dụ trong thế giới thực: Một lớp có tên Động vật có thể chứa các đối tượng như Mèo, Chó hoặc Cá. Một đối tượng có tựa đề Kinh thánh sẽ thuộc loại Sách, v.v ... Các lớp là chung, các đối tượng là cụ thể. Ví dụ về suy nghĩ này đã giúp tôi khi tôi học Java.


Có ... nhưng phép loại suy cũng có thể gây nhầm lẫn. Nếu Animallà một lớp và Catlà một ví dụ, con mèo âm hộ thú cưng của tôi "Fluffy" là gì?
Stephen C

-2

Lớp là một mẫu hoặc kiểu. Một đối tượng là một thể hiện của lớp.

Ví dụ:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet là một lớp và newTweet là một đối tượng của lớp.


Đây chỉ là những lời nói. Bạn không thực sự giải thích ý nghĩa của các từ. (Và trên thực tế, các lớp Java KHÔNG cư xử như mẫu, hoặc là trong cuộc sống thực hay trong cách mà làm bằng các ngôn ngữ như Javascript, Python, Ruby, vv)
Stephen C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.