2016-01-11 2 views
1

Для проекта я пытаюсь создать класс, в котором я могу извлечь данные из базы данных с помощью спящего режима.Java - статическая ссылка на нестатический метод

В этом классе я также попытаюсь составить список объектов, сделанных с данными, вытащенными из базы данных через 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 --"); 
} 
} 
+0

Не могли бы вы придумать более простой пример? – Andremoniy

+0

Вы не используете объект, вы используете класс. operator.getID() должен быть op.getID() –

ответ

2

Это путаница; в этой части кода:

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 
} 

Вы создаете локальную переменную с именем оператора для обозначения списка, возвращаемого из вызова метода FindAll дао в. Внутри цикла for loop у вас есть локальная переменная 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()); 
} 
+0

Ах, вы правы. im используя оператор вместо op, im идиот. Спасибо за ответ! – DyonBeumer

0

Вы, вероятно, хотели использовать op вместо operator. Последнее имя класса, и вы пытаетесь вызвать метод в этом классе, который не является статичным.

Кроме того, Java имеет очень хорошую конвенцию, которая поможет быстро идентифицировать эту проблему - классы должны начинаться с прописными буквами, а переменные с строчным

0
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 как метод статистики, если вы хотите использовать метод instanced.

Смежные вопросы