gpt4 book ai didi

Java - 对非静态方法进行静态引用

转载 作者:行者123 更新时间:2023-11-30 03:06:09 25 4
gpt4 key购买 nike

对于一个项目,我试图创建一个类,在其中我可以使用 hibernate 从数据库中提取数据。

在本类(class)中,我还尝试使用通过 DAO 从数据库中提取的数据创建对象列表。但是当我尝试循环遍历列表时,Eclipse 提醒我我正在尝试对非静态方法进行静态引用。

我的印象是,如果您使用非静态的对象实例(在本例中为运算符 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
}

您创建一个名为operators 的局部变量来引用从调用DAO 的findAll 方法返回的列表。在 for 循环体内有一个局部变量 op。局部变量op的类型是operator。但是您使用“运算符”就好像它是变量的名称一样。将 operator.getID() 更改为 op.getID()。编译器认为您正在运算符类上调用实例方法 getID,这就是您收到“对非静态方法的静态引用”错误的原因。

您可以通过遵循命名约定来最大限度地减少此类错误。类型(类和接口(interface))应以大写字母开头。实例变量和局部变量应以小写字母开头。按照约定,此代码将变为:

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());
}

关于Java - 对非静态方法进行静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com