[英]Java - making a static reference to a non-static method
對於一個項目,我試圖創建一個類,在其中可以使用休眠模式從數據庫中提取數據。
在此類中,我還將嘗試列出使用通過DAO從數據庫中提取的數據制成的對象的列表。 但是,當我嘗試遍歷列表時,eclipse提醒我,我試圖對非靜態方法進行靜態引用。
我給人的印象是,如果您使用的對象實例(在這種情況下為operator op)不是靜態的,並且它未引用可能起作用的靜態方法。 為什么不起作用,我該如何解決?
特別讓我感到困惑的是,老師給出的示例代碼做相同的事情但確實起作用。
package Client.DAO;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
public class mainTest {
private static EntityManagerFactory entityManagerFactory;
public static void main(String[] args) {
EntityManager em = null;
try {
entityManagerFactory = HibernateUtil.getEntityManagerFactory();
em = entityManagerFactory.createEntityManager();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
operatorDAO dao = new operatorDAOImpl(em);
List<operator> operators = dao.findAll();
for (operator op : operators) {
System.out.print("Id: " + operator.getID());// <-- This doesnt work
System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work
}
}
}
供參考,工作示例代碼。 警告:長
package nl.hu.ict;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import nl.hu.ict.dao.HibernateUtil;
import nl.hu.ict.dao.LecturerDao;
import nl.hu.ict.dao.LecturerDaoHibImpl;
import nl.hu.ict.model.Lecturer;
public class MyHibernateTest {
private static EntityManagerFactory entityManagerFactory;
public static void main(String[] args) {
// get the Hibernate - JPA entityManager
EntityManager em = null;
try {
entityManagerFactory = HibernateUtil.getEntityManagerFactory();
em = entityManagerFactory.createEntityManager();
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
// get the program (not necessary)
// MyHibernateTest test = new MyHibernateTest();
LecturerDao lectDao = new LecturerDaoHibImpl(em);
Integer id;
// handle the database actions
// list all lecturers
List<Lecturer> lecturers = lectDao.findAll();
for (Lecturer lecturer : lecturers) {
System.out.print("Id: " + lecturer.getID());
System.out.print(", First Name: " + lecturer.getFirstName());
System.out.println(", Last Name: " + lecturer.getLastName());
System.out.println(", Last Name: " + lecturer.getLastName());
}
// add an lecturer
Lecturer lect = new Lecturer();
lect.setFirstName("Bill");
lect.setLastName("Pianoman");
lectDao.persist(lect);
// get the id of the added lecturer
id = lect.getID();
// list to view changes
lecturers = lectDao.findAll();
for (Lecturer lecturer : lecturers) {
System.out.print(lecturer);
}
// change a lecturer
// find find it again
lect = lectDao.findById(id);
// change it
lect.setFirstName("Billy");
lectDao.update(lect);
// list to view changes
lecturers = lectDao.findAll();
for (Lecturer lecturer : lecturers) {
System.out.print(lecturer);
}
// delete a lecturer
// find it again
lect = lectDao.findById(id);
// delete it
lectDao.delete(lect);
// list to view changes
lecturers = lectDao.findAll();
for (Lecturer lecturer : lecturers) {
System.out.print(lecturer);
}
em.close();
System.out.println("-- einde --");
}
}
這是命名混亂; 在這部分代碼中:
operatorDAO dao = new operatorDAOImpl(em);
List<operator> operators = dao.findAll();
for (operator op : operators) {
System.out.print("Id: " + operator.getID());// <-- This doesnt work
System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work
}
您創建一個名為operator的局部變量,以引用從DAO的findAll方法的調用返回的列表。 在for循環體內,您有一個局部變量op。 局部變量op的類型是operator。 但是您使用的“操作符”就好像它是變量名一樣。 將operator.getID()
更改為op.getID()
。 編譯器認為您正在運算符類上調用實例方法getID,這就是為什么您會收到“對非靜態方法的靜態引用”錯誤的原因。
您可以通過遵循命名約定來最大程度地減少此類錯誤。 類型(類和接口)應以大寫字母開頭。 實例變量和局部變量應以小寫字母開頭。 按照約定,此代碼變為:
OperatorDAO dao = new OperatorDAOImpl(em);
List<Operator> operators = dao.findAll();
for (Operator operator : operators) {
System.out.print("Id: " + operator.getID());
System.out.print(", First Name: " + operator.getName());
}
您可能想使用op
而不是operator
。 后者是一個類名,您正在嘗試在該類上調用方法,該方法不是靜態的。
此外,java具有非常好的約定,有助於快速識別此問題-類應以大寫字母開頭,而變量以小寫字母開頭
System.out.print("Id: " + operator.getID());// <-- This doesnt work
System.out.print(", First Name: " + operator.getName()); // <-- This doesnt work
應該:
System.out.print("Id: " + op.getID());// <-- This doesnt work
System.out.print(", First Name: " + op.getName()); // <-- This doesnt work
當您想要實例化方法時,您嘗試將getID和getName作為靜態方法進行訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.