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 "Phương thức không tĩnh không thể được tham chiếu 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.

Đâ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 tĩnh 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 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 pháp 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.

lớp Học sinh {int roll_no; Tên chuỗi; static String college = "InformationTech"; static void change () {college = “Management";} Sinh viên (int number, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + name + "" + cao đẳng);} 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 = sinh viên mới (309, "Anh"); stu_1.display (); stu_2.display (); stu_3.display ();}}

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

100 Quản lý Mexico 202 Quản lý Mỹ 309 Quản lý Anh

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, 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’. Ở đâ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 xe bạn đang nhìn thấy (một ví dụ của loại xe hơi) 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 đó, 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 trường hợp. 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ế để sửa 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:

java.util.List riêng tư someMethod () {/ * Một số Mã * / return someList; } public static void main (String [] strArgs) {// Câu lệnh sau đây gây ra lỗi. Bạn biết tại sao .. java.util.List someList = someMethod (); }

Ở đây, phương thức static đang gọi someMethod. Trong lập trình hướng đối tượng, chúng tôi đóng gói dữ liệu cùng với dữ liệu mà chúng tôi muốn thao tác trên đó. Ở đây, không có đối tượng, không có dữ liệu cá thể và trong khi các phương thức cá thể tồn tại như một phần của định nghĩa lớp, 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 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 (vì đị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 một cái gì đó không tồn tại.

public class BookStoreApp2 {// hằng số cho các tùy chọn Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // khai báo mảng item = new BookStoreItem [10]; // khởi tạo mảng int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i 

Ở đâ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 constructor 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 () {// Đặt nội dung của phương thức main tại đây} Sau khi thực hiện việc này, hãy thực hiện như sau bên trong phương thức main () của bạn: 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 bạn để đảm bảo rằng nguyên tắc cơ bản không bị vi phạm.

Facebook Twitter Google Plus Pinterest