2015-07-11 9 views
0

Я изучаю Java и могу использовать некоторую помощь здесь.Ссылка на переменную класса из другого класса с помощью метода

На данный момент я просматриваю полиморфизм, поэтому у меня есть класс Dog и еще один класс, который имеет метод добавления объектов Dog в список (несколько похожий на ArrayList).

package chap8; 

    /** 
    * Created by user1 on 7/11/15. 
    */ 

    class Dog { 
     private String name; 
     private int age; 

     public int getAge() { 
      return age; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setAge(int age) { 
      this.age = age; 
     } 

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

    public class MyDogList { 

     //array to hold dog objects 
     private Dog[] dogs = new Dog[5]; 

     //int to check index in dog array 
     private int nextIndex = 0; 

     //add method to add dog objects to dog array 
     private void add(Dog d) { 
      if(nextIndex < dogs.length) { 
       dogs[nextIndex] = d; 
       nextIndex++; 
       System.out.println("Dog added at position: " + nextIndex); 
       System.out.println("Space left for " + (dogs.length - nextIndex) + " more dogs."); 
      } 

      else { 
       System.out.println("No more space to add dogs!"); 
      } 
     } 

    private void display() { 
     for (int i = 0; i < dogs.length; i++) { 
      System.out.println("Name of Dog: " + dogs[i].getName()); 

     } 
    } 

     public static void main(String[] args) { 
      Dog obj1 = new Dog(); 
      obj1.setName("Corgi"); 
      obj1.setAge(2); 

      MyDogList dogList = new MyDogList(); 
      dogList.add(obj1); 
      dogList.display(); 

      Dog obj2 = new Dog(); 
      obj2.setName("Labrador"); 
      obj2.setAge(3); 

      dogList.add(obj2); 

      Dog obj3 = new Dog(); 
      obj3.setName("Golden Retriever"); 
      obj3.setAge(5); 

      dogList.add(obj3); 
     } 
    } 

Хотя процесс добавления Собаку объектов работ, что я хотел бы иметь еще один метод display, вероятно, в class MyDogList, который будет отображать имена всех объектов Dog в dogs массиве в MyDogList классе. Но потом я понял, что если метод просто принимает массив Dog, нет никакого способа узнать имена отдельных объектов собаки в этом массиве.

Как мне построить такой метод здесь?


EDIT

я понял, от комментариев и ответов, которые я мог бы использовать getter переменной Dog name, чтобы получить имя. Но когда я изменяю код (выделено полужирным шрифтом), я получаю Null Pointer Exception. Что пошло не так? Я пытался получить доступ к позиции массива, прежде чем он был настроен на что-то?

/usr/lib/jvm/java-8-oracle/bin/java -Didea.launcher.port=7535 -Didea.launcher.bin.path=/home/user1/Documents/idea-IC-141.177.4/bin -Dfile.encoding=UTF-8 -classpath "/home/user1/Dropbox/Development/Java/Head First/bin:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/home/user1/Documents/idea-IC-141.177.4/lib/idea_rt.jar" com.intellij.rt.execution.application.AppMain chap8.MyDogList 
Exception in thread "main" Dog added at position: 1 
Space left for 4 more dogs. 
Name of Dog: Corgi 
java.lang.NullPointerException 
    at chap8.MyDogList.display(MyDogList.java:52) 
    at chap8.MyDogList.main(MyDogList.java:64) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

Process finished with exit code 1 
+0

Я не понимаю. Каждая 'Собака' имеет' getName'. –

+1

Я не понимаю, ваш метод 'display' выглядит отлично, вам просто нужно' list [i] .getName() 'или даже лучше' Arrays.stream (list) .map (Dog :: getName) .forEach (System .out :: Println) '. Кажется, вы знаете, как вызывать методы и как использовать массивы - так что конкретно? –

+2

Не полностью меняйте свой вопрос после того, как получите ответ. –

ответ

4

что-то вроде этого, может быть?

public void diplay(){ 
    for (Dog dog : dogs){ 
    if (dog != null && dog.getName() != null){ 
     System.out.println("Name of Dog: " + dog.getName()); 
    } 
    } 
} 

Ваш класс DogList уже содержит массив собак. Не нужно передавать массив собак методу отображения.

Обратите внимание на проверку нулевого значения, так как вы не можете быть уверены, что все позиции массива заполнены.

-1

Насколько я понял, вы хотите что-то подобное в своем классе MyDogList:

public void display(){ 
    for (int i = 0; i < dogs.length; i++) { 
     System.out.println("Name of Dog: " + dogs[i].getName()); 
    } 
} 
+0

возможно NullPointerException. В случае, если собаки [i] равны нулю. – Seeker

-2

Решение.

Добавлен способ отображения. Поставьте нулевую проверку, иначе произойдет исключение nullpointer .

private void display() { 
    for (Dog d : dogs) { 
     // null check 
     if (d != null) { 
      System.out.println("DogName:" + d.getName()); 
     } 
    } 
} 
-1

Я думаю, что это то, что вы ищете.

public void display() { 
    for(int i=0; i<nextIndex; i++) { 
     if(null != this.dogs[i]) { 
     System.out.println(this.dogs[i].getName()); 
     } 
    } 

Перейдите к последнему добавленному объекту и напечатайте имя в объекте Dog. Вам не нужно выполнять итерацию по всему массиву, вам нужно только дойти до того, как установлен параметр nextIndex.

+0

Не могли бы вы добавить объяснение, чтобы люди поняли, что делает ваш код, и чтобы улучшить качество вашего ответа? – Ekin

+0

возможно NullPointerException. В случае, если собаки [i] равны нулю. – Seeker

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