Sự khác biệt giữa phương thức tĩnh và phương thức phiên bản


88

Tôi chỉ đang đọc qua văn bản được đưa cho tôi trong sách giáo khoa của tôi và tôi không thực sự chắc chắn rằng tôi hiểu nó đang nói gì. Về cơ bản, nó cho tôi biết rằng các phương thức tĩnh hoặc phương thức lớp bao gồm từ khóa static "modifier". Nhưng tôi thực sự không biết điều đó có nghĩa là gì?

Ai đó có thể vui lòng giải thích cho tôi bằng những thuật ngữ thực sự đơn giản về Phương thức tĩnh hoặc Phương thức lớp là gì không?

Ngoài ra, tôi có thể nhận được một lời giải thích đơn giản về các phương thức Instance là gì không?

Đây là những gì họ cung cấp cho tôi trong sách giáo khoa:

Có ý nghĩa thực tế quan trọng về sự hiện diện hay vắng mặt của công cụ sửa đổi tĩnh. Một phương thức lớp công khai có thể được gọi và thực thi ngay khi Java xử lý định nghĩa của lớp mà nó thuộc về. Đó không phải là trường hợp của một phương thức instance. Trước khi một phương thức cá thể công khai có thể được gọi và thực thi, một cá thể phải được tạo ra từ lớp mà nó thuộc về. Để sử dụng một phương thức lớp công khai, bạn chỉ cần lớp đó. Mặt khác, trước khi bạn có thể sử dụng một phương thức cá thể công khai, bạn phải có một cá thể của lớp.

Cách thức mà một phương thức tĩnh được gọi trong định nghĩa của một phương thức khác thay đổi tùy theo việc hai phương thức có thuộc cùng một lớp hay không. Trong ví dụ trên, giai thừa và chính đều là phương thức của lớp MainClass. Do đó, việc gọi giai thừa trong định nghĩa của main chỉ đơn giản là tham chiếu đến tên phương thức, "giai thừa".

Câu trả lời:


161

Mô hình cơ bản trong Java là bạn viết các lớp và các lớp đó được khởi tạo. Các đối tượng khởi tạo (một thể hiện của một lớp) có các thuộc tính được liên kết với chúng (các biến thành viên) ảnh hưởng đến hành vi của chúng; khi cá thể có phương thức của nó được thực thi, nó sẽ tham chiếu đến các biến này.

Tuy nhiên, tất cả các đối tượng của một kiểu cụ thể có thể có hành vi hoàn toàn không phụ thuộc vào các biến thành viên; các phương thức này tốt nhất là tĩnh. Bởi ở dạng tĩnh, không cần thể hiện lớp nào để chạy phương thức.

Bạn có thể làm điều này để thực thi một phương thức tĩnh:

MyClass.staticMethod();//Simply refers to the class's static code

Nhưng để thực thi một phương thức không tĩnh, bạn phải thực hiện điều này:

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();//Refer to the instance's class's code

Ở cấp độ sâu hơn, khi trình biên dịch đặt một lớp lại với nhau, nó chứa một số con trỏ đến các phương thức. Khi các phương thức đó được thực thi, nó sẽ theo sau các con trỏ và thực thi mã ở đầu xa. Nếu một lớp được khởi tạo, đối tượng được tạo chứa một con trỏ tới "bảng phương thức ảo", con trỏ này trỏ đến các phương thức được gọi cho lớp cụ thể đó trong phân cấp kế thừa. Tuy nhiên, nếu phương thức là tĩnh thì không cần "bảng phương thức ảo": tất cả các lệnh gọi đến phương thức đó đều đi đến cùng một vị trí trong bộ nhớ để thực thi cùng một mã chính xác. Vì lý do đó, trong các hệ thống hiệu suất cao, tốt hơn nên sử dụng phương pháp tĩnh nếu bạn không phụ thuộc vào các biến cá thể.


2
cảm ơn bạn rất nhiều cho các ví dụ mã họ trông quen thuộc vì vậy tôi hiểu bây giờ
Panthy

4
@Rohan Một cách hay khác để xem xét nó là bất kỳ thứ gì static(một lớp, phương thức hoặc trường) không thực sự thuộc về bất cứ thứ gì, nó chỉ hoạt động trong lớp với mục đích tổ chức.
gobernador

1
Ngoài ra, trường tĩnh được sử dụng làm đối tượng dữ liệu (một đối tượng chứa dữ liệu và do đó không thể thay đổi nhưng bạn có thể thao tác dữ liệu bên trong nó.). hoặc không tức thời !!
user2416728

1
@ user2416728 Bình luận của bạn rất bối rối. Các trường tĩnh có thể được thay đổi, nhưng phạm vi của chúng là toàn cầu đối với môi trường thực thi của chúng. Do đó, bất kỳ mã nào có quyền truy cập vào trường nói trên đều có quyền truy cập vào cùng một dữ liệu. Điều này không tương đương với việc dữ liệu đó không đổi (trừ khi sử dụng công cụ sửa đổi 'cuối cùng').
Nathaniel Ford,

2
aye, "not change" >> ý tôi là không thể khởi tạo được !!
user2416728

19

Các phương thức và biến không được khai báo là static được gọi là phương thức instance và biến instance. Để tham chiếu đến các phương thức và biến thể hiện, trước tiên bạn phải khởi tạo lớp có nghĩa là bạn nên tạo một đối tượng của lớp đó trước. Đối với tĩnh, bạn không cần phải khởi tạo lớp u có thể truy cập các phương thức và biến có tên lớp bằng dấu chấm cái nào ở trong (.)

ví dụ:

Person.staticMethod();           //accessing static method.

đối với phương thức không tĩnh, bạn phải khởi tạo lớp.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

8

Các phương thức static, các biến thuộc về cả lớp chứ không chỉ là một thể hiện đối tượng. Một phương thức tĩnh, biến được liên kết với toàn bộ lớp thay vì với các trường hợp cụ thể của một lớp. Mỗi đối tượng sẽ chia sẻ một bản sao chung của các phương thức tĩnh, các biến. Chỉ có một bản sao cho mỗi lớp, bất kể có bao nhiêu đối tượng được tạo từ nó.


8

Sự khác biệt giữa phương thức tĩnh và phương thức phiên bản

  1. Phương thức instance là các phương thức yêu cầu một đối tượng của lớp nó phải được tạo trước khi nó có thể được gọi. Phương thức tĩnh là các phương thức trong Java có thể được gọi mà không cần tạo một đối tượng của lớp.

  2. Phương thức static được khai báo với từ khóa static. Phương thức instance không có từ khóa static.

  3. Phương thức tĩnh có nghĩa là phương thức này sẽ tồn tại dưới dạng một bản sao duy nhất cho một lớp. Nhưng các phương thức cá thể tồn tại dưới dạng nhiều bản sao tùy thuộc vào số lượng cá thể được tạo cho lớp đó.

  4. Phương thức tĩnh có thể được gọi bằng cách sử dụng tham chiếu lớp. Phương thức instance hoặc không static được gọi bằng cách sử dụng tham chiếu đối tượng.

  5. Các phương thức static không thể truy cập trực tiếp các phương thức instance và các biến instance. Phương thức thể hiện có thể truy cập trực tiếp các biến tĩnh và phương thức tĩnh.

Tham khảo: geeksforgeeks


4

Phương thức thể hiện => được gọi trên thể hiện cụ thể của một lớp cụ thể. Phương thức muốn biết nó được gọi vào lớp nào. Cách nó xảy ra có một tham số vô hình được gọi là 'this'. Bên trong 'this', chúng ta có các thành viên của lớp cá thể đã được thiết lập với các giá trị. 'Đây' không phải là một biến. Đó là một giá trị, bạn không thể thay đổi nó và giá trị này là tham chiếu đến người nhận cuộc gọi. Ví dụ: Bạn gọi thợ sửa chữa (phương pháp mẫu) để sửa TV (chương trình thực tế). Anh ấy đi kèm với các công cụ (tham số 'this'). Anh ấy đi kèm với các công cụ cụ thể cần thiết để sửa TV và anh ấy cũng có thể sửa những thứ khác.

Trong các phương thức static => không có cái gọi là 'this'. Ví dụ: Cùng một thợ sửa chữa (phương pháp tĩnh). Khi bạn gọi cho anh ta, bạn phải chỉ định thợ sửa chữa nào để gọi (như thợ điện). Và anh ấy sẽ đến và sửa TV của bạn mà thôi. Nhưng, anh ấy không có công cụ để sửa những thứ khác (không có thông số 'this').

Các phương thức tĩnh thường hữu ích cho các hoạt động không yêu cầu bất kỳ dữ liệu nào từ một thể hiện của lớp (từ 'this') và có thể thực hiện mục đích dự định của chúng chỉ bằng cách sử dụng các đối số của chúng.


2

Hành vi của một đối tượng phụ thuộc vào các biến và các phương thức của lớp đó. Khi chúng ta tạo một lớp, chúng ta tạo một đối tượng cho nó. Đối với các phương thức tĩnh, chúng tôi không yêu cầu chúng vì các phương thức tĩnh có nghĩa là tất cả các đối tượng sẽ có cùng một bản sao nên không cần đối tượng. ví dụ:

Myclass.get();

Trong phương thức instance, mỗi đối tượng sẽ có hành vi khác nhau vì vậy chúng phải gọi phương thức bằng cách sử dụng đối tượng instance. ví dụ:

Myclass x = new Myclass();
x.get();

1

Nếu trạng thái của một phương thức không được thay đổi hoặc nó sẽ không sử dụng bất kỳ biến cá thể nào.

Bạn muốn gọi phương thức mà không có phiên bản.

Nếu nó chỉ hoạt động trên các đối số được cung cấp cho nó.

Các hàm tiện ích là ví dụ điển hình của các phương thức tĩnh. tức là math.pow (), hàm này sẽ không thay đổi trạng thái cho các giá trị khác nhau. Vì vậy, nó là tĩnh.


1

Tóm lại, phương thức tĩnh và biến tĩnh là cấp độ lớp trong đó phương thức thể hiện và biến thể hiện là cấp độ cá thể hoặc đối tượng.

Điều này có nghĩa là bất cứ khi nào một cá thể hoặc đối tượng (sử dụng ClassName ()) mới được tạo, đối tượng này sẽ giữ lại bản sao của các biến instace của chính nó. Nếu bạn có năm đối tượng khác nhau của cùng một lớp, bạn sẽ có năm bản sao khác nhau của các biến cá thể. Nhưng các biến và phương thức tĩnh sẽ giống nhau cho tất cả năm đối tượng đó. Nếu bạn cần một cái gì đó phổ biến được sử dụng bởi mỗi đối tượng được tạo ra, hãy làm cho nó tĩnh. Nếu bạn cần một phương thức không cần dữ liệu đối tượng cụ thể để hoạt động, hãy làm cho nó tĩnh. Phương thức static sẽ chỉ hoạt động với biến static hoặc sẽ trả về dữ liệu trên cơ sở các đối số được truyền vào.

class A {
    int a;
    int b;

    public void setParameters(int a, int b){
        this.a = a;
        this.b = b;
    }
    public int add(){
        return this.a + this.b;
   }

    public static returnSum(int s1, int s2){
        return (s1 + s2);
    }
}

Trong ví dụ trên, khi bạn gọi add () là:

A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3 

B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5

//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10

class B{
    int s=8;
    int t = 8;
    public addition(int s,int t){
       A.returnSum(s,t);//returns 16
    }
}

Trong lớp đầu tiên, add () sẽ trả về tổng dữ liệu được truyền bởi một đối tượng cụ thể. Nhưng phương thức static có thể được sử dụng để lấy tổng từ bất kỳ lớp nào không độc lập nếu có bất kỳ cá thể hoặc đối tượng cụ thể nào. Do đó, đối với các phương thức chung chỉ cần đối số hoạt động có thể được đặt tĩnh để giữ cho tất cả KHÔ.


0

Phương pháp phiên bản so với phương pháp tĩnh

  1. Phương thức instance có thể truy cập trực tiếp vào các phương thức instance và các biến instance.

  2. Phương thức thể hiện có thể truy cập trực tiếp các biến tĩnh và phương thức tĩnh.

  3. Phương thức tĩnh có thể truy cập trực tiếp các biến tĩnh và phương thức tĩnh.

  4. Các phương thức static không thể truy cập trực tiếp các phương thức instance và các biến instance. Họ phải sử dụng tham chiếu đến đối tượng. Và phương thức tĩnh không thể sử dụng từ khóa này vì không có trường hợp nào cho 'this' để tham chiếu.


-2

Công cụ sửa đổi tĩnh khi được đặt trước một hàm ngụ ý rằng chỉ một bản sao của hàm đó tồn tại. Nếu sửa đổi tĩnh không được đặt trước hàm thì với mọi đối tượng hoặc thể hiện của lớp đó, một bản sao mới của hàm đó sẽ được tạo ra. :) Tương tự là trường hợp với các biến.

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.