2017-02-06 1 views
0

Так что я пытаюсь вызвать свой метод printDetails() из класса Customer в классе CustomerTest. Значения переменных не записываются, и я получаю null для имени и ошибки для массива при его запуске. Я просто не уверен, как получить значения для переменных, которые будут записываться и распечатываться.Вызов метода из другого класса с собственными переменными

public class Customer { 
    public String name; 
    public int[] itemCost;  
    public void printDetails(){ 
     System.out.print("Great, here is your customer's purchase details: \n"); 
     System.out.print("Name:"+name); 
     System.out.println(); 
     for (int i = 0; i < itemCost.length; i ++){ 
      System.out.print("Item Cost #" + (i+1) + " : "); 
      System.out.print(itemCost[i] + "\n");  
      } 
     int sum = IntStream.of(itemCost).sum(); 
     System.out.println("Total:" + sum); 
    } 
} 

public class CustomerTest { 
    public static void main(String[] args){ 
     Customer main = new Customer(); 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Do you want to create a customer? \n"); 
     String s = scan.next(); 
     if(s.equals("y") || s.equals("yes")){ 
      System.out.print("Ok, what's his/her name? \n"); 
      String name = scan.next(); 
      System.out.print("How many items is the customer buying? \n"); 
      int n = scan.nextInt(); 
      int itemCost[] = new int[n]; 
      for (int i = 0; i < itemCost.length; i ++){ 
       System.out.print("Enter a value for item #"+(i+1)); 
       System.out.printf("%n"); 
       int j = scan.nextInt();        
       itemCost[i] = j; 
      } 
     main.printDetails(); 
     } 
    } 
} 
+1

Фактически вам нужно присваивать вещи переменным в вашем экземпляре 'Customer', например. 'main.name = scan.next();' вместо 'String name = scan.next()'. –

ответ

0

Вы сохраняете значения из своего сканера в локальных переменных и не добавляете их в переменные Клиента.

Должно выглядеть так:

Customer main = new Customer(); 
    Scanner scan = new Scanner(System.in); 
    System.out.print("Do you want to create a customer? \n"); 
    String s = scan.next(); 
    if(s.equals("y") || s.equals("yes")){ 
     System.out.print("Ok, what's his/her name? \n"); 
     main.name = scan.next(); //HERE 
     System.out.print("How many items is the customer buying? \n"); 
     int n = scan.nextInt(); 
     main.itemCost = new int[n]; //HERE 
     for (int i = 0; i < main.itemCost.length; i ++){ //HERE 
      System.out.print("Enter a value for item #"+(i+1)); 
      System.out.printf("%n"); 
      int j = scan.nextInt();        
      main.itemCost[i] = j; //AND HERE 
     } 
    main.printDetails(); 
    } 
0

Вам нужно присвоить значение, например, из Customer класса.

Пример кода

public class CustomerTest { 
    public static void main(String[] args){ 
     Customer main = new Customer(); 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Do you want to create a customer? \n"); 
     String s = scan.next(); 
     if(s.equals("y") || s.equals("yes")){ 
      System.out.print("Ok, what's his/her name? \n"); 
      String name = scan.next(); 
      main.name = name;    //added to assign value of name to Custommer's name. 
      System.out.print("How many items is the customer buying? \n"); 
      int n = scan.nextInt(); 
      int itemCost[] = new int[n]; 
      main.itemCost = new int[n]; //Here also need to initialize size for array. 
      for (int i = 0; i < itemCost.length; i ++){ 
       System.out.print("Enter a value for item #"+(i+1)); 
       System.out.printf("%n"); 
       int j = scan.nextInt();        
       itemCost[i] = j; 
       main.itemCost[i] = j; //added to assign value of itemCost to Custommer's itemCost. 
      } 
     main.printDetails(); 
     } 
    } 
} 

теперь вы не можете получить нулевое значение для name и itemCost.

надеюсь, что это вам поможет.

0

Использование Settersметода в вашем Customer классе, так что вы можете установить значение от CustomerTest до Customer переменного класса. Как это:

клиентов Класс:

public class Customer { 
public String name; 
public int[] itemCost;  
public void printDetails(){ 
    System.out.print("Great, here is your customer's purchase details: \n"); 
    System.out.print("Name:"+name); 
    System.out.println(); 
    for (int i = 0; i < itemCost.length; i ++){ 
     System.out.print("Item Cost #" + (i+1) + " : "); 
     System.out.print(itemCost[i] + "\n");  
     } 
    int sum = IntStream.of(itemCost).sum(); 
    System.out.println("Total:" + sum); 
} 
/** 
* Your Setters method... 
*/ 
public void setName(String name){ 
    this.name = name; 
} 
public void setItemCost(int[] itemCost){ 
    this.itemCost= itemCost; 
} 
} 

после этого, вы используете его в CustomerTest так:

CustomerTest Класс:

// In the End part of your CustomerTestClass 
main.setName(name); 
main.setItemCost(itemCost); 
main.printDetails(); 
+1

Я закончил заниматься самостоятельно, но это то, как я сделал это благодаря! –

+0

это здорово, у вас должны быть сеттеры для хорошего дизайна ваших «классов». если вы хотите проверить, чтобы помочь другим с моим ответом. @JeremyLleva. – msagala25

0

Вы создали же переменные в CustomerTest, как в классе Customer.

Это не будет работать, поскольку между этими локальными переменными класса CustomerTest и действительными объектами объекта Customer нет привязки.

Вам нужно сделать следующее, чтобы на самом деле сделать изменения отражают все места:

class CustomerTest{ 

    public static void main(){ 
    ... 
    ... 
    Scanner sc = new Scanner(); 
    Customer obj = new Customer(); 
    obj.name = sc.next(); 
    ... 
    ... 
    //Test print function 
    obj.printDetails(); 
    } 
} 

Это будет работать! Следует помнить: внесение одинаковых имен переменных в класс не сохраняет значение между объектами!

0

вы можете использовать и присваиватель, чтобы установить значение для клиента name и itemCost, а затем вызвать printDetails() метод, при использовании этого подхода, вы должны создать объект клиента для каждого из них, на другой стороны, вы можете передать значение параметра для printDetails() как это public void printDetails(String name, int[] itemCost) { // same logic here } затем вызвать его с помощью main.printDetails(name, itemCost);

0

вы можете объявить конструктор клиента с именем и itemCost в качестве параметров, как этот

public Customer(String name, int[] itemCost){ 
    this.name = name; 
    this.itemCost = itemCost; 
} 

и в тестовом классе вы можете Буй l Объект Customer после ввода пользователем, например,

public class CustomerTest { 
    public static void main(String[] args){ 
     Customer main; // = new Customer(); 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Do you want to create a customer? \n"); 
     String s = scan.next(); 
     if(s.equals("y") || s.equals("yes")){ 
      System.out.print("Ok, what's his/her name? \n"); 
      String name = scan.next(); 
      System.out.print("How many items is the customer buying? \n"); 
      int n = scan.nextInt(); 
      int itemCost[] = new int[n]; 
      for (int i = 0; i < itemCost.length; i ++){ 
       System.out.print("Enter a value for item #"+(i+1)); 
       System.out.printf("%n"); 
       int j = scan.nextInt();        
       itemCost[i] = j; 
      } 
     main = new Customer(name, itemCost); 
     main.printDetails(); 
     } 
    }