Khắc phục: Phương pháp không tĩnh Không thể được tham chiếu từ bối 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 mã hóa. 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 cho lỗi là đúng.

Phương pháp không tĩnh không thể được tham chiếu từ bối cảnh tĩnh

Đây là một lỗi rất phổ biến đối với 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 ra 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ẽ đi qua 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ì?

Thêm từ khóa 'tĩnh' vào bất kỳ phương thức nào 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ể dễ dàng được gọi mà không cần điều kiện tạo một thể hiện của một lớp.

Ví dụ, có một số cách sử dụng các phương thức tĩnh khác nhau, bằng cách 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 Tĩnh. Ví dụ, nếu bạn muốn truy cập các trường không tĩnh của lớp, bạn phải sử dụng phương thức không tĩnh. Vì vậy, để tóm tắt, các phương thức tĩnh được sử dụng rất ít nhưng chúng có 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.

 sinh viên lớp {int roll_no; Tên chuỗi; trường đại học tĩnh = "InformationTech"; static void thay đổi () {cao đẳng = Quản lý "; cao đẳng);} public static void main (String args []) {Học sinh.change (); Sinh viên stu_1 = sinh viên mới (100, "Mexico"); Sinh viên stu_2 = sinh viên mới (202, "Mỹ"); Sinh viên stu_3 = Học sinh mới (309, "Người 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 trên đường và bạ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 xe ngay cả khi bạn không biết mô hình hoặc loại của nó là gì. Đ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 nghĩ về lớp học ở đây như một khuôn mẫu hoặc một ý tưởng.

Bây giờ khi bạn di chuyển gần hơn, bạn nhìn thấy mô hình và làm cho chiếc xe. Ở đây bạn đang nhận ra 'ví dụ' của lớp 'xe hơi'. Ở đây tất cả các thuộc tính sẽ được trình bày chi tiết; các bánh xe, mã lực, vành, vv

Một ví dụ về các đặc tính có thể là lớp 'xe hơi' nói rằng tất cả các xe nên có bánh xe. Chiếc xe mà bạn đang nhìn thấy (một ví dụ của lớp xe hơi) có vành hợp kim.

Trong lập trình hướng đối tượng, bạn tự xác định lớp và bên trong lớp, bạn xác định trường có loại '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 sắc ở phần phụ trợ và sau này, bạn có thể cung cấp cho giá trị cụ thể này (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 thể hiện. Chúng được tạo ra cho giá trị hoặc các mục dành riêng cho lớp và không phải là cá thể. Đối với các phương thức, có thể có các phương thức toàn cầu (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ể tĩnh nếu bạn chỉ sản xuất ô tô bình thường).

Bây giờ, chúng tôi sẽ xem xét tất cả các trường hợp khác nhau trong đó mã hóa của bạn có thể sai và xem các cách giải quyết để 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 đã bắt 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à 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 về phương thức gọi là gì (về mặt tĩnh hay không). Hãy xem đoạn mã sau:

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

Ở đây, phương thức tĩnh đ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. Ở đâ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, 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 tắt, 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 đối tượng, nên phương thức không tĩnh 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: 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 chính tĩnh mà không tạo một thể hiện của các phương thức, bạn sẽ nhận được một thông báo lỗi. Ở đây, nguyên tắc tương tự được áp dụng; bạn không thể truy cập một cái gì đó không tồn tại.

 lớp công khai BookStoreApp2 {// hằng 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; printMothy (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // kết thúc câu lệnh switch} // kết thúc vòng lặp for (int i = 0; i <item.length; i ++) {} // end của for} // kết thúc phương thức chính 

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

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

 công khai BookStoreApp2 () {// Đặt nội dung của phương thức chính vào đây} Sau khi thực hiện việc này, hãy thực hiện các thao tác 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 hoạt động 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.

Bài ViếT Thú Vị