TheNameHobbs
TheNameHobbs

Reputation: 729

"Non-static variable this cannot be referenced from a static context" when I'm trying to instantiate an object - why?

The program is meant to take in user input info and store it in a arraylist employee object. I'm not exactly sure why these errors are here. Any help?

Code:

import java.util.*;
import java.io.*;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;

public class P
{
//Instance Variables
private static String empName;
private static String wage;
private static double wages;
private static double salary;
private static int numHours;
private static double increase; 

//  static ArrayList<String> ARempName = new ArrayList<String>();
//  static ArrayList<Double> ARwages = new ArrayList<Double>();
//  static ArrayList<Double> ARsalary = new ArrayList<Double>();
static ArrayList<Employee> emp = new ArrayList<Employee>();

public static void main(String[] args) throws Exception
{       
    Employee emp1 = new Employee("", 0);    


clearScreen();
printMenu();
question();
exit();
}

public static void printArrayList(ArrayList<Employee> emp)
{
    for (int i = 0; i < emp.size(); i++){
            System.out.println(emp.get(i));
}
}

public static void clearScreen()
{
    System.out.println("\u001b[H\u001b[2J");
}

private static void exit()
{
System.exit(0);
}

private static void printMenu()
{
System.out.println("\t------------------------------------");
System.out.println("\t|Commands: n - New employee        |");
System.out.println("\t|          c - Compute paychecks   |");
System.out.println("\t|          r - Raise wages         |");
System.out.println("\t|          p - Print records       |");
System.out.println("\t|          d - Download data       |");
System.out.println("\t|          u - Upload data         |");
System.out.println("\t|          q - Quit                |");
System.out.println("\t------------------------------------");
System.out.println("");
}

private static void question()
{
System.out.print("Enter command: ");
Scanner q = new Scanner(System.in);
String input = q.nextLine();
input.replaceAll("\\s","").toLowerCase();

boolean valid = (input.equals("n") || input.equals("c") || input.equals("r") ||    input.equals("p") || input.equals("d") || input.equals("u") || input.equals("q"));

if (!valid){
    System.out.println("Command was not recognized; please try again.");
printMenu();
question();
}
else if (input.equals("n")){
    System.out.print("Enter the name of new employee: ");
    Scanner stdin = new Scanner(System.in);
    empName = stdin.nextLine();
    emp1.setName(empName);
    System.out.print("Hourly (h) or salaried (s): ");
    Scanner stdin2 = new Scanner(System.in);
    wage = stdin2.nextLine();
    wage.replaceAll("\\s","").toLowerCase(); 
    if (!(wage.equals("h") || wage.equals("s"))){
    System.out.println("Input was not h or s; please try again");
    }
    else if (wage.equals("h")){
    System.out.print("Enter hourly wage: ");
    Scanner stdin4 = new Scanner(System.in);
    wages = stdin4.nextDouble();
    emp1.setWage(wages);
    printMenu();
    question();}
    else if (wage.equals("s")){
    System.out.print("Enter annual salary: ");
    Scanner stdin5 = new Scanner(System.in);
    salary = stdin5.nextDouble();
    emp1.setWage(salary);
    printMenu();
    question();}}
else if (input.equals("c")){
    System.out.print ("Enter number of hours worked by " + empName);
    Scanner stdin = new Scanner(System.in);
    numHours = stdin.nextInt();
    System.out.println("Pay: ");
    System.out.print("Enter number of hours worked by " + empName);
        Scanner stdin2 = new Scanner(System.in);
        numHours = stdin2.nextInt();
        System.out.println("Pay: ");
    printMenu();
    question();}
else if (input.equals("r")){
    System.out.print("Enter percentage increase: ");
    Scanner stdin = new Scanner(System.in);
    increase = stdin.nextDouble();
    System.out.println("\nNew Wages");
    System.out.println("---------");
//      System.out.println(Employee.toString());
    printMenu();
    question();
    }
else if (input.equals("p")){
    printArrayList(emp);
    printMenu();
    question();
}
else if (input.equals("q")){
    exit();
}
}


public abstract class Employee {
private String name;
private double wage;

protected Employee(String name, double wage){
  this.name = name;
  this.wage = wage;
}

public String getName() {
  return name;
}

public double getWage() {
  return wage;
}

public void setName(String name) {
  this.name = name;
}

public void setWage(double wage) {
  this.wage = wage;
}

public void percent(double wage, double percent) {
  wage *= percent;
}
}

public class HourlyEmployee extends Employee {
//Instance Variables
public String result;

public HourlyEmployee(String name, double wage){
  super(name, wage);
}

public void computePay(double wage){
  if (numHours <= 40){
    wage *= numHours;}
  else {
    wage = numHours * (1.5 * wage);}
}

/*  public void toString(){
  System.out.println("Name: " + name);
}*/
}

public class SalariedEmployee extends Employee {
    //Instance Variables
private double salary;
private int salHours = 2080;

    public SalariedEmployee(String name, double wage){
      super(name, wage);
    }

    public void computePay(double wage){
      salary = (salHours * salary) / 52;}

public double getSalary(){
  return salary;
}

public void setSalary(double salary) {
  this.salary = salary;
}

/*     public void toString(){
      System.out.print("Name:  " name + getSalary() + "/year");
     }*/
}
}

Error:

javac P.java
P.java:24: non-static variable this cannot be referenced from a static context
    Employee emp1 = new Employee("", 0);    
                    ^
P.java:82: cannot find symbol
symbol  : variable emp1
location: class P
    emp1.setName(empName);
    ^
P.java:94: cannot find symbol
symbol  : variable emp1
location: class P
    emp1.setWage(wages);
    ^
P.java:101: cannot find symbol
symbol  : variable emp1
location: class P
    emp1.setWage(salary);
    ^
4 errors

Any hints to point me in the right direction would be more than appreciated!

Upvotes: 0

Views: 1293

Answers (3)

thedayofcondor
thedayofcondor

Reputation: 3876

Your code is easy to fix:

You have to replace:

public abstract class Employee {}

with

public static class Employee {}

abstract classes cannot be instantiated, plus I think you mean the employee class to be static.

Then, move

final Employee emp1 = new Employee("", 0);

into:

private static void question() {}

as emp1 is only used in that function and it would not otherwise be visible (it is "out of scope") or, as an alternative, declare it as a global variable.

Upvotes: 0

Sean Patrick Floyd
Sean Patrick Floyd

Reputation: 298898

non-static variable this cannot be referenced from a static context

Employee is a non-static inner class and as such it must have an enclosing instance of the outer class. Hence you can't create an Employee without a P

The mechanism is explained in the Java Tutorial > Nested Classes

Change this line:

public abstract class Employee {

to

public static abstract class Employee {

and it should work (you'll have to change the different Employee subtypes as well)

Upvotes: 0

DWolf
DWolf

Reputation: 725

You cannot instantiate an abstract class, also emp1 isnt locally initialized .. prolly because you cant instantiate an object to a abstract..

      Employee emp1 = HiredEmployee("", 0) or SalaryEmployee("", 0);

Upvotes: 1

Related Questions