Một lớp, một đối tượng và một thể hiện trong Java là gì?
Câu trả lời:
Java (và bất kỳ ngôn ngữ lập trình nào khác) được mô hình hóa theo kiểu và giá 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ủy và kiểu tham chiếu . Các kiểu tham chiếu được chia thành các lớp và kiể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.
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.)
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 House
mô 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();
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.
static
biế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)
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"
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;
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 instance
là một thuật ngữ chung cho object
. FYI, Object
là 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.
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.
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
someCar
là tham chiếu đến một phiên bản Xe hơi. Bản thân cá thể không có tên.
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.
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
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.
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.
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.
Đị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.
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.
Animal
là một lớp và Cat
là một ví dụ, con mèo âm hộ thú cưng của tôi "Fluffy" là gì?
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.