簡體   English   中英

Java-對非靜態方法進行靜態引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM