2013-08-07 43 views
10

Tôi biết rằng trong OOP, instance = object. Vì vậy, nếu chúng tôi có lớp học như thế này:Sự khác biệt chức năng giữa một cá thể và một đối tượng là gì?

public class something 
{ 
    public static void main(String args[]) 
    { 
    } 
} 

Dòng này trong phương pháp chính có tạo đối tượng mới instance?

something instance=new something(); 

câu hỏi thứ hai của tôi là tương tự: nếu chúng ta tạo Thread đối tượng - Thread t1=new Thread(); nó thực sự có nghĩa là chúng ta đã tạo ra một thể hiện của lớp Thread, từ đó chúng ta tĩnh có thể gọi phương pháp? (ví dụ: sleep()).

+5

+1 để đặt câu hỏi đơn giản, rõ ràng và súc tích. Bạn sẽ ngạc nhiên khi có bao nhiêu người ở đây hỏi những câu hỏi đơn giản trong tâm trí một cách cực kỳ phức tạp. – christopher

+0

Tôi luôn cực kỳ chú ý đến điều đó (một nửa gia đình tôi không phải là người bản xứ Anh, và bạn đã bao giờ thử nói với một gánh nặng của người Ả Rập họ sai à? Đó là những thứ đáng sợ). Tuy nhiên, có những người ở đây những người ** là ** người bản xứ tiếng Anh và vẫn cố gắng để làm cho mình âm thanh thông minh hơn, hoặc hơn phức tạp các câu hỏi với những thứ như một vấn đề 'XY'. Tôi đã tìm ra, trong khi tôi thấy một ví dụ điển hình về một câu hỏi đơn giản, cũng có thể khen ngợi OP! – christopher

Trả lời

12

nếu chúng ta tạo đối tượng Thread - Thread t1 = new Thread(); nó thực sự có nghĩa là chúng ta đã tạo ra thể hiện của lớp Thread, từ đó chúng ta có thể gọi phương thức tĩnh? (ví dụ: sleep()).

Khi bạn gọi phương thức tĩnh, bạn không gọi nó từ đối tượng. Đó là lý do tại sao nó tĩnh. Không cần một cá thể để thực hiện một phương thức tĩnh.

Ví dụ

Thread t1 = new Thread(); 
t1.checkAccess(); // <--- This is an instance method. 

Thread.activeCount(); // <-- This is a static method. 

Khi bạn nhìn thấy từ khóa new, nó có nghĩa là một đối tượng mới được tạo ra. Trong trường hợp này, nó là một thể hiện của lớp Thread, như bạn đã nói đúng.

Làm thế nào để bạn phân biệt chúng?

Thật đơn giản. Nếu đó là một phương thức thể hiện, nó sẽ được gọi từ ngữ cảnh của đối tượng .

String str = new String("hello"); 
str = str.replaceAll("o", ""); 

Như bạn thấy, bạn phải tạo một dụ sử dụng một phương pháp dụ.

Với phương thức tĩnh, thậm chí còn dễ dàng hơn. Họ sẽ được gọi với không có gì ngoài tên của lớp.

String.copyValueOf(new char[] {'a', 'b', 'c'}); 

Không cần phải tạo phiên bản String mới. Đơn giản chỉ cần sử dụng tên của lớp.

LƯU Ý: Như đã chỉ ra trong các ý kiến, một phương pháp tĩnh thể được gọi từ một đối tượng dụ, nhưng đây không phải là thực tế phổ biến. Nếu bạn không chắc chắn, tài liệu là người bạn tốt nhất của bạn. Hoặc bạn có thể chỉ cần kiểm tra bằng cách cố gắng gọi cùng một phương thức từ ngữ cảnh tĩnh.

Khi nào sử dụng phương pháp tĩnh thay vì phương pháp thể hiện?

Vâng này được trả lời, rất tốt, ở đây: Java: when to use static methods và tôi thấy không có ý nghĩa trong lặp lại nó :)

+1

Có thể đáng chú ý là mặc dù bạn không cần một cá thể để thực hiện một phương thức tĩnh, bạn có thể thực hiện nó. Nó không phải là một lỗi cú pháp để viết t1.activeCount() – Mike

+1

Không, nhưng tôi khá chắc chắn rằng hầu hết các IDE sẽ phàn nàn rằng bạn đang gọi một phương thức tĩnh từ một đối tượng thể hiện, vì vậy hầu hết thời gian một phương thức tĩnh sẽ được (hoặc ít nhất phải) được gọi từ ngữ cảnh của lớp. – christopher

+0

Bạn nói đúng, IDE thường đưa ra cảnh báo. Tôi chỉ nghĩ rằng nó sẽ làm cho một bổ sung tốt đẹp cho câu trả lời của bạn vì nó là một tính năng ngôn ngữ khó hiểu cho các lập trình viên mới. – Mike

2

Một đối tượng được tạo ra trong cả hai trường hợp bạn trích dẫn:

something instance=new something(); 
Thread t1=new Thread(); 

Tuy nhiên, trong trường hợp thứ hai, mặc dù một đối tượng Thread được tạo, một luồng không được bắt đầu cho đến khi bạn bắt đầu nó.

thực sự có nghĩa là chúng tôi đã tạo phiên bản của chủ đề lớp, từ đó chúng ta có thể gọi phương thức tĩnh? (ví dụ: sleep()).

Bạn không cần đối tượng để gọi phương thức tĩnh. Một phương thức tĩnh áp dụng cho toàn bộ lớp, chứ không phải là một cá thể cụ thể. Bạn có thể gọi Thread.sleep() như thế này:

Thread.sleep(500); 
1

Đối với câu hỏi đầu tiên của bạn, vâng, điều đó sẽ tạo ra một thể hiện của something trong biến instance (không phải là một tên biến lớn, bằng cách này).

Để câu hỏi thứ hai của bạn, có, mã đó sẽ tạo một phiên bản của Chủ đề. Tuy nhiên, bạn sẽ không gọi các phương thức tĩnh với nó (như t1.sleep()). Các phương thức tĩnh được gọi với tên lớp, ví dụ: Thread.sleep. Bạn không phải tạo một cá thể cho những người đó.

0

thể hiện không là gì ngoài việc cấp phát bộ nhớ động. . ví dụ malloc(), calloc() là chức năng cấp phát bộ nhớ động để chúng ta có thể nói chúng đang tạo ra cá thể nhưng chúng ta không thể nói rằng chúng đang tạo đối tượng.

Các vấn đề liên quan