0

このプログラムは、ユーザー入力情報を受け取り、arraylist 従業員オブジェクトに格納することを目的としています。これらのエラーがここにある理由は正確にはわかりません。何か助けはありますか?

コード:

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");
     }*/
}
}

エラー:

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

私を正しい方向に向けるヒントがあれば、大歓迎です!

4

3 に答える 3

1

抽象クラスをインスタンス化することはできません。また、オブジェクトを抽象クラスにインスタンス化できないため、emp1 はローカルで初期化されません。

      Employee emp1 = HiredEmployee("", 0) or SalaryEmployee("", 0);
于 2012-11-06T20:07:15.703 に答える
0

非静的変数 これは静的コンテキストから参照できません

Employee非静的内部クラスであるため、外部クラスの囲みインスタンスが必要です。Employeeしたがって、なしで を作成することはできませんP

メカニズムは、Java チュートリアル > ネストされたクラスで説明されています。

この行を変更します。

public abstract class Employee {

public static abstract class Employee {

それはうまくいくはずです(さまざまな従業員サブタイプも変更する必要があります)

于 2012-11-06T20:22:28.297 に答える
0

あなたのコードは簡単に修正できます:

以下を置き換える必要があります。

public abstract class Employee {}

public static class Employee {}

抽象クラスはインスタンス化できません。さらに、従業員クラスを静的にすることを意味していると思います。

次に、移動

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

の中へ:

private static void question() {}

emp1 はその関数でのみ使用され、それ以外の場合は表示されないため (「スコープ外」)、または代わりにグローバル変数として宣言します。

于 2012-11-06T20:16:13.050 に答える