Sự khác biệt giữa đối tượng và cá thể


82

Tôi biết loại câu hỏi này đã được hỏi trước đây , nhưng tôi vẫn cảm thấy rằng câu trả lời quá mơ hồ đối với tôi (và, nói cách khác, một số / hầu hết người mới bắt đầu) không thể nắm bắt được.

Tôi đã cố gắng dạy cho mình những khái niệm rộng hơn về lập trình hơn là OOP thủ tục và cơ bản. Tôi hiểu các khái niệm cụ thể về OOP (bạn tạo một lớp có dữ liệu (thành viên) và chức năng (phương thức) và sau đó khởi tạo lớp đó tại thời điểm chạy để thực sự làm những việc như vậy).

Tôi nghĩ rằng tôi có quyền xử lý một lớp là gì ( một loại bản thiết kế cho một cá thể sẽ được tạo ra giống như nó tại thời điểm biên dịch ). Nhưng nếu đúng như vậy thì đối tượng là gì? Tôi cũng biết rằng trong các ngôn ngữ dựa trên nguyên mẫu, điều này có thể làm mọi thứ trở nên phức tạp hơn, nhưng có lẽ đây là lý do tại sao cần phải có sự phân biệt rõ ràng giữa đối tượng và thể hiện trong tâm trí tôi.

Ngoài ra, tôi phải vật lộn với các khái niệm về "đối tượng" và "đối tượng". Rất nhiều nguồn mà tôi đọc (bao gồm cả các câu trả lời tại SO) nói rằng chúng phần lớn giống nhau và sự khác biệt là về ngữ nghĩa. Những người khác nói rằng có một sự khác biệt thực sự về khái niệm giữa hai người.

Các chuyên gia tại SO có thể giúp một người mới bắt đầu có khoảnh khắc "tuyệt vời" đó để tiến lên trong thế giới OOP không?

Lưu ý: đây không phải là bài tập về nhà, tôi không đi học - tuy nhiên, tôi nghĩ nó sẽ giúp ích cho những người đang tìm kiếm sự trợ giúp về bài tập về nhà.


1
Tôi tự hỏi liệu bạn có muốn thêm một số câu hỏi bổ sung như "có phải tất cả các phiên bản đều là đối tượng không?" và, "có phải tất cả các đối tượng không?" Nếu cả hai đều "có", thì chúng ta có thể xác nhận rằng chúng giống nhau.
WesternGun

Khi bạn khởi tạo một lớp (sử dụng new), thứ được khởi tạo đó sẽ trở thành một đối tượng. Một đối tượng là thứ có thể tuân theo các nguyên tắc đóng gói, đa hình, trừu tượng của lập trình hướng đối tượng và thứ thực mà chương trình tương tác để sử dụng các thành viên thể hiện được định nghĩa trong lớp. Đối tượng chứa các thành viên thể hiện (các thành viên không tĩnh). Như vậy thể hiện của một lớp là một đối tượng. Từ 'dụ' được sử dụng khi bạn đang đề cập đến nguồn gốc từ nơi nó sinh ra, nó là rõ ràng hơn nếu bạn nói 'thể hiện của một lớp' so với 'đối tượng của một lớp'
p_champ

Câu trả lời:


129

Bản thiết kế cho một ngôi nhà giống như một bản mô tả lớp học. Tất cả những ngôi nhà được xây dựng từ bản thiết kế đó đều là đối tượng của lớp đó. Một ngôi nhà nhất định là một ví dụ.


6
Ngoài ra, có một con phố ở quê tôi có một chút nổi tiếng ở địa phương vì có 8 ngôi nhà gạch được xây giống hệt nhau (trước khi khái niệm "phát triển nhà ở" ra đời). Vì vậy, tôi có thể hình dung điều đó rất độc đáo. “Đẳng cấp” là những gì mà kiến ​​trúc sư đã vẽ ra. Những ngôi nhà đã hoàn thành là "vật thể" vì chúng đều được xây dựng giống hệt nhau. Mỗi ngôi nhà là một "dụ" bởi vì họ có (và có thể tiếp tục được) tất cả các xử lý khác nhau kể từ đó [nay người ta đứng về phía: o (].
TCCV

16
Và Phương thức tĩnh giống như tiện ích mà tất cả các nhà đều dùng chung.
WOPR

2
Nhưng không phải một ngôi nhà được xây dựng từ bản thiết kế là một ví dụ?
Hot Licks

1
Nó có nghĩa là, các ký ức đầu tiên được định nghĩa lớp chiếm giữ là ví dụ. trong khi tất cả các đối tượng được tạo ra được gọi là đối tượng.
Hafiz Shehbaz Ali

6
Không phải đối tượng và cá thể hoàn toàn giống nhau?
Praveen Kumar

42

Sự thật là lập trình hướng đối tượng thường tạo ra sự nhầm lẫn bằng cách tạo ra sự không kết nối giữa khía cạnh triết học của sự phát triển và hoạt động cơ học thực tế của máy tính. Tôi sẽ cố gắng đối chiếu cả hai cho bạn:

Khái niệm cơ bản của OOP là: Class >> Object >> Instance.

Lớp = chữ in màu xanh lam. Đối tượng là một thứ thực tế được xây dựng dựa trên 'bản in màu xanh lam' (giống như ngôi nhà). Một thể hiện là một bản sao ảo (nhưng không phải là bản sao thật) của đối tượng.

Giải thích kỹ thuật hơn về một 'trường hợp' là nó là một 'tham chiếu bộ nhớ' hoặc một biến tham chiếu. Điều này có nghĩa là một 'instance' là một biến trong bộ nhớ chỉcó địa chỉ bộ nhớ của một đối tượng trong đó. Đối tượng mà nó giải quyết là cùng một đối tượng mà ví dụ được cho là 'một thể hiện của'. Nếu bạn có nhiều trường hợp của một đối tượng, bạn thực sự chỉ có nhiều biến ở những vị trí khác nhau trong bộ nhớ của bạn mà tất cả đều có cùng địa chỉ bộ nhớ chính xác trong đó - tất cả đều là địa chỉ của cùng một đối tượng chính xác. Bạn không thể 'thay đổi' một phiên bản, mặc dù có vẻ như bạn có thể làm được trong mã của mình. Điều bạn thực sự làm khi 'thay đổi' một thể hiện là bạn thay đổi trực tiếp đối tượng ban đầu. Về mặt điện tử, bộ xử lý đi qua một vị trí bổ sung trong bộ nhớ (biến / thể hiện tham chiếu) trước khi nó thay đổi dữ liệu của đối tượng ban đầu.

Quá trình này là: bộ xử lý >> vị trí bộ nhớ của phiên bản >> vị trí bộ nhớ của đối tượng gốc.

Lưu ý rằng bạn sử dụng trường hợp nào không quan trọng - kết quả cuối cùng sẽ luôn giống nhau. TẤT CẢ các cá thể sẽ tiếp tục duy trì cùng một thông tin chính xác trong các vị trí bộ nhớ của chúng - địa chỉ bộ nhớ của đối tượng - và chỉ đối tượng mới thay đổi.

Mối quan hệ giữa lớp và đối tượng khó hiểu hơn một chút, mặc dù về mặt triết học, nó là mối quan hệ dễ hiểu nhất (blue print >> house). Nếu đối tượng là dữ liệu thực tế được lưu giữ ở đâu đó trong bộ nhớ, thì 'lớp' là gì? Nó chỉ ra rằng về mặt cơ học đối tượng là một bản sao chính xác của lớp. Vì vậy, lớp chỉ là một biến khác ở đâu đó khác trong bộ nhớ chứa thông tin chính xác giống như đối tượng. Lưu ý sự khác biệt giữa các mối quan hệ:

Đối tượng là một bản sao của lớp. Instance là một biến chứa địa chỉ bộ nhớ của đối tượng.

Bạn cũng có thể có nhiều đối tượng của cùng một lớp và sau đó là nhiều phiên bản của mỗi đối tượng đó. Trong những trường hợp này, tập hợp các thể hiện của mỗi đối tượng có giá trị tương đương nhau, nhưng các thể hiện giữa các đối tượng thì không. Ví dụ:

Cho Lớp A Từ Lớp A cho Object1, Object2 và Object3.

// Đối tượng1 có cùng giá trị chính xác với đối tượng2 và đối tượng3, nhưng ở những vị trí khác nhau trong bộ nhớ.

từ Object1 >> let obj1_Instance1, obj1_Instace2, obj1_Instance3

// tất cả các trường hợp này cũng có giá trị tương đương và ở các vị trí khác nhau trong bộ nhớ. Giá trị của chúng = Object1.MemoryAddress.

Vân vân.

Mọi thứ trở nên lộn xộn hơn khi bạn bắt đầu giới thiệu các loại. Đây là một ví dụ sử dụng các loại từ c #:

// giả sử lớp Person tồn tại Person john = new Person ();

Trên thực tế, mã này dễ phân tích hơn nếu bạn chia nó thành hai phần:

Person john;
john = new Person();

Nói về kỹ thuật, dòng đầu tiên 'khai báo một biến kiểuNgười. Nhưng điều đó có nghĩa gì?? Lời giải thích chung là bây giờ tôi có một biến rỗng chỉ có thể chứa một đối tượng Person. Nhưng chờ một phút - nó là một biến trống! Không có gì trong vị trí bộ nhớ biến đó. Nó chỉ ra rằng 'các loại' là vô nghĩa về mặt máy móc. Các loại ban đầu được phát minh như một cách để quản lý dữ liệu và không có gì khác. Ngay cả khi bạn khai báo các kiểu nguyên thủy như int, str, chr (w / o khởi tạo nó), không có gì xảy ra trong máy tính. Khía cạnh cú pháp kỳ lạ này của lập trình là một phần trong đó mọi người có ý tưởng rằng các lớp là bản thiết kế của các đối tượng. OOP thậm chí còn trở nên khó hiểu hơn với các loại có kiểu đại biểu, trình xử lý sự kiện, v.v. Tôi sẽ cố gắng không tập trung vào chúng quá nhiều và chỉ cần nhớ rằng tất cả chúng đều là từ viết sai.

Dòng thứ hai cũng hơi khó hiểu vì nó thực hiện hai việc cùng một lúc:

Phía bên phải "Người mới ()" được đánh giá đầu tiên. Nó tạo ra một bản sao mới của lớp Person - nghĩa là nó tạo ra một đối tượng mới.

Phía bên trái "john =", sau đó được đánh giá sau đó. Nó biến john thành một biến tham chiếu, cung cấp cho nó địa chỉ bộ nhớ của đối tượng vừa được tạo ở phía bên phải của cùng một dòng.

Nếu bạn muốn trở thành một nhà phát triển giỏi, điều quan trọng cần hiểu là không có môi trường máy tính nào hoạt động dựa trên những lý tưởng triết học. Máy tính thậm chí còn không hợp lý như vậy - chúng thực sự chỉ là một tập hợp lớn các sợi dây được dán lại với nhau bằng cách sử dụng các mạch boolean cơ bản (chủ yếu là NAND và OR).


32

Từ Class xuất phát từ Phân loại ( Một loại mà một cái gì đó được đặt vào ), Bây giờ tất cả chúng ta đã nghe nói rằng một Lớp giống như một Bản thiết kế, nhưng điều này chính xác có nghĩa là gì? Nó có nghĩa là Lớp chứa Mô tả của một Danh mục cụ thể, ( Tôi muốn chỉ ra sự khác biệt giữa Lớp, Đối tượng và Cá thể bằng ví dụ bằng cách sử dụng Java và tôi sẽ yêu cầu người đọc hình dung nó giống như một Câu chuyện khi đọc nó, và nếu bạn không quen thuộc với java không thành vấn đề ) Vì vậy, chúng ta hãy bắt đầu với việc tạo một Category có tên là HumanBeing , vì vậy chương trình Java sẽ diễn đạt nó như sau

class HumanBeing{ 
   /*We will slowly build this category*/ 
}

Bây giờ các thuộc tính gì một HumanBeing có nói chung Tên , Tuổi , Chiều cao , trọng lượng cho bây giờ chúng ta hãy hạn chế tự của chúng tôi để bốn thuộc tính, chúng ta hãy thêm nó vào loại của chúng tôi

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight; 

   /*We still need to add methods*/

}

Giờ đây, mỗi danh mục đều có một hành vi, ví dụ danh mục Chó có hành vi sủa, lấy, cuộn, v.v., Tương tự như vậy, danh mục HumanBeing của chúng tôi cũng có thể có một số hành vi nhất định, ví dụ khi chúng tôi hỏi HumanBeing của bạn tên / tuổi / cân nặng / Chiều cao? Nó sẽ cung cấp cho chúng tôi tên / tuổi / cân nặng / chiều cao, vì vậy trong java, chúng tôi thực hiện như sau

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight;  

    public HumanBeing(String Name,int Age,float Height,float Weight){
       this.Name = Name;
       this.Age  = Age;
       this.Height = Height;
       this.Weight = Weight;
    }

    public String getName(){
      return this.Name;
    }

    public int getAge(){
      return this.age;
    }

    public float getHeight(){
      return this.Height;
    }

    public float getWeight(){
      return this.Weight;
    }
}

Bây giờ chúng tôi đã thêm hành vi vào danh mục HumanBeing của chúng tôi , vì vậy chúng tôi có thể hỏi tên, tuổi, chiều cao, cân nặng của nó nhưng bạn sẽ hỏi những chi tiết này từ ai, bởi vì class HumanBeingchỉ là một danh mục, nó là một bản thiết kế, ví dụ một Kiến trúc sư lập bản thiết kế một tờ giấy về tòa nhà mà anh ta muốn xây, bây giờ chúng ta không thể tiếp tục sống trong bản thiết kế ( mô tả của nó về tòa nhà ) chúng ta chỉ có thể sống trong tòa nhà sau khi nó được xây dựng. Vì vậy, ở đây chúng ta cần tạo ra một con người từ danh mục của chúng ta mà chúng ta đã được mô tả ở trên, vậy làm cách nào để chúng tôi thực hiện điều đó trong Java

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);    
  }
}

Bây giờ trong ví dụ trên, chúng ta đã tạo ra con người đầu tiên của chúng ta với tên là cân nặng theo tuổi chiều cao, vậy chính xác thì điều gì đang xảy ra trong đoạn mã trên? . Chúng tôi đang khởi tạo danh mục của chúng tôi là HumanBeing, tức là một Đối tượng của lớp chúng tôi được tạo

Lưu ý: Đối tượng và Đối tượng không phải là Từ đồng nghĩa Trong một số trường hợp, có vẻ như Đối tượng và Đối tượng là Từ đồng nghĩa nhưng không phải vậy, tôi sẽ đưa ra cả hai trường hợp

Trường hợp 1: Đối tượng và Cá thể dường như là Từ đồng nghĩa
Hãy để tôi giải thích một chút, khi chúng ta nói HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90); Một Đối tượng thuộc danh mục của chúng ta được tạo trên bộ nhớ heap và một số địa chỉ được cấp cho nó và firstHumangiữ một tham chiếu đến địa chỉ đó, bây giờ Đối tượng này là Một đối tượng của con người và cũng là một ví dụ của con người . Ở đây có vẻ như Objects và Instance là những từ đồng nghĩa, tôi sẽ tự nhắc lại rằng chúng không phải là từ đồng nghĩa

Hãy để chúng tôi tiếp tục câu chuyện của mình, chúng tôi đã tạo ra Con người đầu tiên của chúng tôi, bây giờ chúng tôi có thể hỏi tên, tuổi, chiều cao, cân nặng của anh ấy, đây là cách chúng tôi làm điều đó trong Java

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);
    System.out.println(firstHuman.getName());
    System.out.println(firstHuman.getAge());
    ...
    ...  
  }
}

vì vậy chúng ta có con người đầu tiên và hãy cho phép con người đầu tiên của chúng ta một số bằng cấp, hãy biến anh ta thành Bác sĩ, vì vậy chúng ta cần một danh mục gọi là Bác sĩ và cung cấp cho Bác sĩ của chúng ta một số hành vi, vì vậy trong java chúng ta làm như sau

class Doctor extends HumanBeing{
   public Doctor(String Name,int Age,float Height,float Weight){
      super(Name,Age,Height,Weight);
   }
   public void doOperation(){
    /* Do some Operation*/ 
   }

   public void doConsultation(){
    /* Do so Consultation*/
   }
}  

Ở đây chúng tôi đã sử dụng khái niệm Thừa kế mang lại một số khả năng tái sử dụng trong mã, Mỗi bác sĩ sẽ luôn là một Con người đầu tiên, vì vậy Một bác sĩ sẽ có Tên, Tuổi, Cân nặng, Chiều cao sẽ được Kế thừa từ Con người thay vì viết lại, lưu ý rằng chúng tôi vừa viết mô tả về một bác sĩ mà chúng tôi chưa tạo, vì vậy hãy để chúng tôi tạo một Bác sĩ trongclass Birth

class Birth{
  public static void main(String [] args){
    Doctor firstDoctor = new Doctor("Strange",40,6,80);
    .......
    .......
    /*Assume some method calls , use of behaviour*/
    .......
    .......    
  }
}

Trường hợp 2: Đối tượng và Đối tượng không phải là Từ đồng nghĩa
Trong đoạn mã trên, chúng ta có thể hình dung rằng chúng ta đang Khởi tạo danh mục của mình Tiến sĩ và đưa nó vào cuộc sống tức là chúng ta chỉ đơn giản tạo một Đối tượng của danh mục Tiến sĩ , Như chúng ta đã biết Đối tượng được tạo trên Bộ nhớ HeapfirstDoctorgiữ một tham chiếu đến Đối tượng đó trên heap;

Đối tượng cụ thể firstDoctornày như sau (xin lưu ý firstDoctorgiữ một tham chiếu đến đối tượng, nó không phải là đối tượng chính nó)

  1. firstDoctormột đối tượngclass Doctormột ví dụ của Aclass Doctor
  2. firstDoctorkhông phải An Đối tượngclass HumanBeing Nhưng một thể hiện củaclass HumanBeing

Vì vậy, một đối tượng cụ thể có thể là một thể hiện của một lớp cụ thể nhưng nó không cần phải là một đối tượng của lớp đã cho đó

Phần kết luận:

Một đối tượng được cho là một Thể hiện của một Danh mục cụ thể nếu nó thỏa mãn tất cả các đặc tính của Danh mục cụ thể đó

Ví dụ trong thế giới thực sẽ như sau, chúng ta đầu tiên được sinh ra là Con người vì vậy hãy hình dung chúng ta là Đối tượng của Con người, bây giờ khi chúng ta lớn lên chúng ta nhận trách nhiệm và học các kỹ năng mới và đóng các vai trò khác nhau trong cuộc sống như con trai, anh trai, con gái, cha. , mẹ bây giờ Thực ra chúng ta là gì? Có thể nói chúng ta là Đối tượng của Con người Nhưng là Bản thể của Anh trai, con gái, ..., v.v.

Tôi hi vọng cái này giúp được

Cảm ơn bạn


5
... và tại sao chúng ta chỉ có 3 ủng hộ cho câu trả lời này?
Pratik Ambani

13

nhập mô tả hình ảnh ở đây

Đối tượng là những thứ trong bộ nhớ trong khi cá thể là những thứ tham chiếu đến chúng. Trong hình trên:

  • std (instance) -> Student Object (phải)
  • std1 (instance) -> Student Object (left)
  • std2 (instance) -> Student Object (left)
  • std3 (instance) -> no object (null)

4
Điều đó thật tuyệt. Tôi thực sự thích thực tế là nó được cấp thấp. Tôi đang quay đi quay lại xem liệu tôi có thích điều này hơn là sự tương tự hay không. Tôi nghĩ rằng biết cả hai cùng nhau là điều tôi thực sự cần. ủng hộ, nhưng không chắc liệu tôi có thể đưa ra câu trả lời cho bạn hay không vì nó đã được trao cho Joe. Cảm ơn bạn mặc dù. Điều này rõ ràng hơn rất nhiều.
TCCV

Vậy một thể hiện là một con trỏ tới một đối tượng? (biến instance == có địa chỉ bộ nhớ?)
Stano

6
Truong, câu trả lời của bạn là sai và khó hiểu. Trên thực tế, một thể hiện là một đối tượng có nguồn gốc từ một đối tượng lớp cơ sở. Đối tượng Instance ==. Thuật ngữ này là tốt giải thích ví dụ như trong này hay này câu trả lời.
Stano

@jww: Hình ảnh là một liên kết đến math.hws.edu/javanotes/c5/objectsInHeap.png , bây giờ là 404. Có lẽ nó đã được hiển thị vào thời điểm nó được đăng.
Matt Burland

6

Một đối tượng là một thể hiện của một lớp (đối với các ngôn ngữ dựa trên lớp).

Tôi nghĩ đây là lời giải thích đơn giản nhất mà tôi có thể đưa ra.


1
Tôi đồng ý rằng giải thích của bạn là đúng với cách tôi đã đọc, nhưng có rất nhiều mục trực tuyến phân biệt giữa hai điều này. Tôi không biết nếu loại câu hỏi này không thể được trả lời mà không có ngôn ngữ trong đầu (wow một câu hỏi meta, câu hỏi này là một lớp không thể được sử dụng nếu không khởi tạo nó bằng một ngôn ngữ, lol).
TCCV

6

Một lớp định nghĩa một đối tượng. Bạn có thể đi xa hơn nữa bằng nhiều ngôn ngữ và nói rằng một giao diện xác định các thuộc tính và phương thức chung giữa các đối tượng.

Một đối tượng là một cái gì đó có thể đại diện cho một cái gì đó trong thế giới thực. Khi bạn muốn đối tượng thực sự đại diện cho một thứ gì đó trong thế giới thực thì đối tượng đó phải được khởi tạo. Thuyết minh có nghĩa là bạn phải xác định các đặc điểm (thuộc tính) của đối tượng cụ thể này, thường thông qua một phương thức khởi tạo.

Khi bạn đã xác định các đặc điểm này, bạn sẽ có một thể hiện của một đối tượng.

Hy vọng điều này sẽ làm rõ ràng mọi thứ.


Tôi nghĩ về cơ bản đó là những gì Joe đã nói. Hãy sửa cho tôi nếu tôi sai.
TCCV

3
Ở trên Joe nói rằng tất cả những ngôi nhà được xây dựng từ bản thiết kế đều là đồ vật. Thật. Và anh ta nói rằng một ngôi nhà nhất định là một ví dụ. Thật. Nhưng, tất cả các ngôi nhà đều là cá thể và một ngôi nhà nhất định cũng là một đối tượng. Anh ấy đã tạo ra sự khác biệt ở nơi không có. Trong mã, cần phải phân biệt giữa một đối tượng và một cá thể tại thời điểm chúng ta xây dựng nó. Chúng tôi nói rằng nó được khởi tạo khi nó thực sự được xây dựng. Một câu hỏi phổ biến có thể là: Bạn có nhớ khởi tạo đối tượng không? I E. nếu bạn quên gọi hàm tạo sau khi bạn khai báo một đối tượng.
Derek Litz,

1
à, đó là một sự phân biệt tốt. Vì vậy, nói một cách khác, một thể hiện là một đối tượng đã được xây dựng (tức là đã gọi hàm tạo).
TCCV

3

"Một lớp mô tả một tập hợp các đối tượng được gọi là các thể hiện của nó." - Nhóm Nghiên cứu Học tập Xerox, "Hệ thống Smalltalk-80", Tạp chí Byte Tập 06 Số 08, tr39, 1981.


2

Đối tượng là gì?

Một đối tượng là một thể hiện của một lớp. Đối tượng có thể được hiểu tốt nhất bằng cách tìm các ví dụ thực tế xung quanh bạn. Bàn làm việc, máy tính xách tay, ô tô của bạn đều là những ví dụ điển hình trong thế giới thực về một vật thể.

Đối tượng trong thế giới thực có chung hai đặc điểm, chúng đều có trạng thái và hành vi. Con người cũng là một ví dụ điển hình về một đối tượng, Con người chúng ta có trạng thái / thuộc tính - tên, chiều cao, cân nặng và hành vi - đi bộ, chạy, nói chuyện, ngủ, mã: P.

Class là gì?

Một lớp là một bản thiết kế hoặc một khuôn mẫu mô tả các chi tiết của một đối tượng. Những chi tiết này là viz

thuộc tính tên / hoạt động trạng thái / phương thức

class Car 
{
    int speed = 0;
    int gear = 1;

    void changeGear(int newGear)
    {
        gear = newGear;
    }

    void speedUp(int increment) 
    {
        speed = speed + increment;
    }

    void applyBrakes(int decrement) 
    {
        speed = speed - decrement;
    }
}

Hãy xem xét ví dụ trên, các lĩnh vực speedgearsẽ đại diện cho nhà nước của đối tượng, và các phương pháp changeGear, speedUpapplyBrakesxác định hành vi của các đối tượng xe với thế giới bên ngoài.

Người giới thiệu:


1

Tôi nghĩ rằng điều quan trọng là phải chỉ ra rằng nhìn chung có hai điều. Bản thiết kế và các bản sao. Mọi người có xu hướng đặt tên cho những thứ khác nhau này; lớp, đối tượng, cá thể chỉ là một số tên mà mọi người sử dụng cho chúng. Điều quan trọng là có bản thiết kế và các bản sao của nó - bất kể tên của chúng là gì. Nếu bạn đã có sự hiểu biết về hai điều này, chỉ cần tránh những điều khác đang làm bạn bối rối.


0

Hãy so sánh táo với táo. Tất cả chúng ta đều biết táo là gì. Nó trông như thế nào. Nó có vị như thế nào. Đó là một lớp học. Nó là định nghĩa của một sự vật. Đó là những gì chúng ta biết về một thứ.

Bây giờ hãy đi tìm một quả táo. Đó là một ví dụ. Chúng ta có thể thấy nó. Chúng ta có thể nếm thử. Chúng ta có thể làm mọi thứ với nó. Nó là những gì chúng ta có.

Class = Những gì chúng ta biết về một cái gì đó. Một định nghĩa.

Object / Instance = Cái gì đó phù hợp với định nghĩa mà chúng ta có và có thể làm mọi thứ.


0

Trong một số trường hợp, thuật ngữ "đối tượng" có thể được sử dụng để mô tả một cá thể, nhưng trong những trường hợp khác, nó được sử dụng để mô tả một tham chiếu đến một cá thể. Thuật ngữ "cá thể" chỉ đề cập đến cá thể thực tế.

Ví dụ, một Danh sách có thể được mô tả như một tập hợp các đối tượng, nhưng những gì nó thực sự chứa là các tham chiếu đến các thể hiện đối tượng.


Vì vậy, trong trường hợp này, một tham chiếu chỉ là một trình giữ chỗ chứa một liên kết đến cá thể? Trường hợp một liên kết có thể là một cái gì đó giống như một địa chỉ bộ nhớ?
TCCV

0

Tôi luôn thích ý tưởng coi định nghĩa của một lớp giống như định nghĩa của "Kiểu dữ liệu trừu tượng" . Có nghĩa là, khi bạn xác định một lớp, bạn đang xác định một kiểu mới của "cái gì đó", biểu diễn kiểu dữ liệu của nó, về mặt nguyên thủy và "thứ gì đó" khác, và hành vi của nó về mặt chức năng và / hoặc phương thức. (Xin lỗi vì sự chung chung và hình thức)

Bất cứ khi nào bạn xác định một lớp, bạn sẽ mở ra một khả năng mới để xác định các thực thể nhất định với các thuộc tính và hành vi của nó, khi bạn khởi tạo và / hoặc tạo một đối tượng cụ thể từ nó, bạn đang thực sự hiện thực hóa khả năng đó.

Đôi khi đối tượng điều khoản và các trường hợp có thể hoán đổi cho nhau. Một số người theo chủ nghĩa thuần túy OOP sẽ cho rằng mọi thứ đều là một đối tượng, tôi sẽ không phàn nàn, nhưng trong thế giới OOP thực, các nhà phát triển chúng tôi sử dụng hai khái niệm:

  1. Lớp: Mẫu kiểu dữ liệu trừu tượng mà từ đó bạn có thể lấy ADT khác và tạo đối tượng.
  2. Đối tượng: Còn được gọi là cá thể, đại diện cho các ví dụ cụ thể về cấu trúc dữ liệu và các chức năng được biểu diễn bằng một Kiểu dữ liệu trừu tượng nhất định.

0

Lập trình hướng đối tượng là một phép ẩn dụ hệ thống giúp bạn tổ chức kiến ​​thức mà chương trình của bạn cần để xử lý, theo cách giúp bạn phát triển chương trình của mình dễ dàng hơn. Khi bạn chọn lập trình bằng OOP, bạn chọn OOP-Googles của mình và bạn quyết định rằng bạn sẽ thấy vấn đề của thế giới thực khi nhiều đối tượng cộng tác với nhau bằng cách gửi tin nhắn. Thay vì nhìn thấy một Anh chàng đang lái xe, bạn sẽ thấy một Anh chàng gửi tin nhắn tới chiếc xe cho biết anh ta muốn chiếc xe đó làm gì. Chiếc xe là một đối tượng lớn và sẽ phản hồi thông báo đó bằng cách gửi tin nhắn đến động cơ hoặc bánh xe của nó để có thể phản hồi đúng những gì Người lái xe yêu cầu anh ta làm trong tin nhắn, v.v.

Sau khi bạn đã tạo phép ẩn dụ hệ thống của mình và bạn thấy tất cả thực tế là các đối tượng gửi tin nhắn, bạn quyết định đưa tất cả những thứ bạn đang thấy có liên quan đến miền sự cố của bạn vào PC. Ở đó, bạn nhận thấy rằng có rất nhiều Người lái các thẻ khác nhau, và thật vô nghĩa khi lập trình hành vi của từng người trong số họ một cách riêng biệt vì tất cả họ đều cư xử theo cùng một cách ... Vì vậy, bạn có thể nói hai điều:

  • Tất cả những người đó đều hành xử theo cùng một cách, vì vậy tôi sẽ tạo một lớp có tên là Driver sẽ chỉ định những người mà tất cả các Driver trên thế giới hành xử, bởi vì họ đều hành xử theo cùng một cách. (Và bạn đang sử dụng OOP dựa trên lớp)
  • Hoặc bạn có thể nói Hey! Người lái xe thứ hai hành xử giống như Người lái xe thứ nhất, ngoại trừ anh ta thích đi nhanh hơn một chút. Và Người lái xe thứ ba hành xử giống như Người lái xe thứ nhất, ngoại trừ việc anh ta thích lạng lách khi lái xe. (Và bạn sử dụng OOP dựa trên nguyên mẫu).

Sau đó, bạn bắt đầu đưa vào máy tính thông tin về cách tất cả các Trình điều khiển hoạt động (hoặc trình điều khiển đầu tiên hoạt động như thế nào và trình điều khiển thứ hai và thứ ba khác với trình điều khiển đó như thế nào), và sau một thời gian, bạn có chương trình của mình và bạn sử dụng mã để tạo ba trình điều khiển là mô hình bạn đang sử dụng bên trong PC đó để giới thiệu đến các trình điều khiển bạn đã thấy trong thế giới thực. 3 trình điều khiển mà bạn đã tạo bên trong PC là các phiên bản của nguyên mẫu (thực ra cái đầu tiên là nguyên mẫu, cái đầu tiên có thể là chính nguyên mẫu tùy thuộc vào cách bạn mô hình hóa mọi thứ) hoặc lớp mà bạn đã tạo. Sự khác biệt giữa thể hiện và đối tượng là đối tượng đó là phép ẩn dụ mà bạn sử dụng trong thế giới thực. Bạn chọn xem anh chàng và chiếc xe như những đối tượng (Sẽ không chính xác nếu nói rằng bạn xem chúng như những vật thể) hợp tác giữa chúng. Và sau đó bạn sử dụng nó làm nguồn cảm hứng để tạo mã của mình. Cá thể chỉ tồn tại trong chương trình của bạn, sau khi bạn đã tạo nguyên mẫu hoặc lớp. Các "đối tượng" tồn tại bên ngoài PC vì ánh xạ của nó mà bạn sử dụng để hợp nhất thế giới thực với chương trình. Nó hợp nhất Guy với phiên bản Driver mà bạn đã tạo trong PC. Vì vậy, đối tượng và cá thể cực kỳ liên quan, nhưng chúng không hoàn toàn giống nhau (một thể hiện là "chân" của một đối tượng trong chương trình, và "chân" kia là trong thế giới thực).


0

Tôi đoán câu trả lời tốt nhất đã được đưa ra.

Các lớp học là bản thiết kế, và các đối tượng là các tòa nhà hoặc ví dụ về bản thiết kế đó cũng là một mẹo nhỏ đối với tôi.

Đôi khi, tôi muốn nghĩ rằng các lớp là các mẫu (như trong MS Word), trong khi các đối tượng là các tài liệu sử dụng mẫu.


0

Mở rộng một trong các ví dụ đã cho trước đó trong chuỗi này ...

Hãy xem xét một kịch bản - Có một yêu cầu rằng cần phải xây dựng 5 ngôi nhà trong một khu phố để làm nơi ở. Cả 5 ngôi nhà đều có chung một kiến ​​trúc xây dựng. Kiến trúc công trình là một đẳng cấp . Nhà là một đối tượng . Mỗi ngôi nhà với những người ở trong đó là một ví dụ .

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.