Computer >> Máy Tính >  >> Xử lý sự cố >> Lỗi Windows

Khắc phục:Không thể tham chiếu phương thức không tĩnh từ ngữ cảnh tĩnh

Nhiều lập trình viên phải đối mặt với thông báo lỗi ‘ Không thể tham chiếu phương thức không tĩnh từ ngữ cảnh tĩnh 'Khi họ đang viết mã. Thông báo lỗi này không cụ thể và có thể xảy ra trong bất kỳ IDE nào nếu các điều kiện của lỗi là đúng.

Khắc phục:Không thể tham chiếu phương thức không tĩnh từ ngữ cảnh tĩnh

Đây là một lỗi rất phổ biến đối với những người mới bắt đầu khi lập trình viên cố gắng sử dụng một lớp ‘tĩnh’ mà không tạo một thể hiện của lớp đó. Có một số điều kiện phải được đáp ứng khi bạn đang sử dụng một lớp tĩnh. Trong bài viết này, chúng tôi sẽ xem xét một số trường hợp khác nhau và hướng dẫn bạn cách sử dụng một lớp tĩnh.

Phương pháp tĩnh là gì?

Việc thêm từ khóa ‘static’ vào bất kỳ phương thức nào sẽ làm cho phương thức được gọi là phương thức tĩnh. Một phương thức static thuộc về lớp chứ không thuộc về một đối tượng (là chuẩn). Một phương thức tĩnh có thể được gọi dễ dàng mà không cần điều kiện tạo một thể hiện của một lớp.

Có một số cách sử dụng khác nhau của các phương thức Static, chẳng hạn như sử dụng nó, bạn có thể thay đổi một thành viên dữ liệu tĩnh và giá trị của nó. Tuy nhiên, vẫn còn một số hạn chế khi sử dụng phương thức Static. Ví dụ, nếu bạn muốn truy cập các trường không tĩnh của lớp mình, bạn phải sử dụng phương thức không tĩnh. Vì vậy, tóm lại, các phương thức tĩnh được sử dụng rất ít nhưng chúng có những lợi ích của chúng.

Dưới đây là một ví dụ ngắn về cách một phương thức tĩnh có thể được thực hiện để thay đổi thuộc tính của tất cả các đối tượng.

class Students{ 

 int roll_no; 

 String name; 

 static String college = "InformationTech"; 

 static void change(){ 

 college = “Management"; } 

 Students (int number, String name_self){ 

 roll_no = number; 

 name = name_self;  } 

 void display (){System.out.println(rollno+" "+name+" "+college);} 

public static void main(String args[]){ 

Students.change(); 

Students stu_1 = new Students (100,"Mexican"); 

Students stu_2 = new Students (202,"American"); 

Students stu_3 = new Students (309,"British"); 

stu_1.display(); 

stu_2.display(); 

stu_3.display(); 

}  }

Đầu ra của chương trình sẽ là:

100 Mexican Management 202 American Management 309 British Management

Sự khác biệt giữa một lớp và thể hiện của một lớp là gì?

Hãy nghĩ rằng bạn đang đi bộ trên đường và bạn nhìn thấy một chiếc xe hơi. Bây giờ bạn ngay lập tức biết rằng đây là một chiếc ô tô ngay cả khi bạn không biết kiểu hoặc loại của nó. Điều này là do bạn biết rằng nó thuộc về loại 'xe hơi' mà bạn đã biết. Hãy coi lớp học ở đây như một khuôn mẫu hoặc một ý tưởng.

Bây giờ khi bạn tiến lại gần hơn, bạn sẽ thấy mô hình và cấu tạo của chiếc xe. Ở đây bạn đang nhận ra ‘instance’ của lớp ‘car’. Tại đây tất cả các thuộc tính sẽ được trình bày chi tiết; bánh xe, mã lực, vành, v.v.

Một ví dụ về các thuộc tính có thể là lớp ‘car’ nói rằng tất cả các ô tô phải có bánh xe. Chiếc ô tô bạn đang nhìn thấy (một ví dụ của loại ô tô) có vành hợp kim.

Trong lập trình hướng đối tượng, bạn tự định nghĩa lớp và bên trong lớp, bạn xác định một trường kiểu ‘màu’. Bất cứ khi nào lớp được khởi tạo, bộ nhớ sẽ tự động được dành riêng cho màu ở phần phụ trợ và sau này, bạn có thể cung cấp cho giá trị này một giá trị cụ thể (ví dụ:màu đỏ). Vì các thuộc tính như thế này là cụ thể, chúng không tĩnh.

Ngược lại, các phương thức và trường tĩnh được chia sẻ với tất cả các phiên bản. Chúng được tạo cho giá trị hoặc các mục cụ thể cho lớp chứ không phải bản thân cá thể. Đối với các phương thức, có thể có các phương thức toàn cục (ví dụ:bộ chuyển đổi stringtoInt) và đối với các trường, chúng thường là các hằng số theo mã của bạn (ví dụ:loại ô tô có thể là tĩnh nếu bạn chỉ sản xuất ô tô bình thường).

Bây giờ, chúng ta sẽ xem xét tất cả các trường hợp khác nhau mà mã của bạn có thể bị sai và xem các giải pháp thay thế để khắc phục chúng.

Vấn đề 1:Bạn đang gọi một cái gì đó không tồn tại

Chúng tôi đã gặp một số trường hợp người dùng đang sử dụng cả phương thức tĩnh và phương thức không tĩnh với nhau. Khi chúng tôi làm điều này, bạn nên cẩn thận xem phương thức nào đang gọi cái gì (về mặt tĩnh hay không). Hãy xem đoạn mã sau:

private java.util.List<String> someMethod(){

    /* Some Code */

    return someList;           }

public static void main(String[] strArgs){         

     // The following statement causes the error. You know why..

    java.util.List<String> someList = someMethod();        }

Ở đây, phương thức static đang gọi someMethod. Trong lập trình hướng đối tượng, chúng ta đóng gói dữ liệu cùng với dữ liệu mà chúng ta muốn thao tác trên đó. Ở đây, không có đối tượng, sẽ không có dữ liệu cá thể và mặc dù các phương thức cá thể tồn tại như một phần của định nghĩa lớp, thì luôn phải có một cá thể đối tượng để cung cấp dữ liệu cho chúng.

Vì vậy, tóm lại, bạn không thể gọi một cái gì đó không tồn tại. Vì bạn có thể chưa tạo một đối tượng nên phương thức non-static vẫn chưa tồn tại. Tuy nhiên, mặt khác, một phương thức tĩnh sẽ luôn tồn tại (do định nghĩa).

Vấn đề 2:Các phương thức không được tạo tĩnh

Nếu bạn đang gọi các phương thức từ phương thức Static main của mình mà không tạo một phiên bản của các phương thức, bạn sẽ nhận được thông báo lỗi. Ở đây, nguyên tắc tương tự cũng được áp dụng; bạn không thể truy cập thứ gì đó không tồn tại.

public class BookStoreApp2 {

    //constants for options

    Scanner input = new Scanner (System.in);

    public static void main(String[] args) {

        BookStoreItem[] item;//declaring array

        item = new BookStoreItem[10];//initializing array

        int itemType = -1;

        printMenu();

        getUserChoice();

        for (int i = 0; i < item.length; i++){

            }//end of switch statement

        }//end of for loop

        for (int i = 0; i < item.length; i++) {

        }//end of for

    }//end of main method

Ở đây trong mã này, bạn cần chuyển đổi cả hai phương thức printMenu () getUserChoice () thành các phương thức tĩnh.

Do đó, nếu bạn muốn giải quyết tình huống như thế này, bạn có thể sử dụng hàm tạo thay thế. Ví dụ:bạn có thể lấy nội dung của phương thức main () và đặt chúng bên trong một hàm tạo.

public BookStoreApp2()

{
   // Put contents of main method here}
After doing this, do the following inside your main() method:

public void main( String[] args )

{ 
new BookStoreApp2();           }

Nếu các mẹo này không hiệu quả với mã của bạn hoặc mã của bạn khác, bạn nên ghi nhớ các nguyên tắc cơ bản của các lớp và phương thức Tĩnh và kiểm tra lại mã của mình để đảm bảo rằng nguyên tắc cơ bản không bị vi phạm.