2017-04-09 4 views
3

Für ein Projekt, das ich mache, würde ich gerne eine separate Klasse verwenden, um Informationen von verschiedenen Personen in einer Arraylist zu speichern. In diesem Fall enthält die Methode eine String-Arraylist, um alle meine Informationen zu speichern. Als ich dies versuchte, erkannte ich, dass jedes Mal, wenn ich die storage ausführen, um eine Zeichenfolge zu der Arraylist hinzuzufügen, es alle vorherigen Informationen von der Arraylist loszuwerden.Wie verwende ich eine Methode in Java, um Informationen von einer Arraylist zu speichern


ist es möglich, sowohl die es so Strings Hello, How Are You?I'm fine. How Are You? und fügen den Array in der Klasse zu machen, ohne das Array two sobald das Verfahren erneut ausgeführt wird zurückgesetzt, mit?

public class one 
{ 
    public static void main (String [] args) 
    { 
     two t = new two(); 

     t.storage("Hello, How Are You?"); 
     t.storage("I'm fine. How Are You?"); 
    } 
} 
import java.util.ArrayList; 
public class two 
{ 
    public static void storage(String toBeAdded) 
    { 
     ArrayList<String> al = new ArrayList<String>(); 

     al.add(toBeAdded); 
     System.out.println(al); 
    } 
} 

Gegeben Ausgang:

[Hello, How Are You?] [I'm fine. How Are You?]

Erwartete Ausgabe:

[Hello, How Are You?] [Hello, How Are You?, I'm fine. How Are You?]

+0

Sie benötigen eine Array-Liste außerhalb Ihrer Methode zu initialisieren, aber warum Sie tun sogar das Objekt initialisieren, wenn alles, was Sie brauchen, ist statische Methode –

+0

Hinweis: Lesen Sie über Java-Namenskonventionen. Klassen gehen UpperCase. Und darüber hinaus: Das sind wirklich grundlegende Dinge; wahrscheinlich in * irgendeinem * Buch zu dem Thema erklärt. – GhostCat

Antwort

2

Es gibt zwei Möglichkeiten, Ihr Problem zu lösen:

Optio n (1): Ihr aktueller ArrayList Umfang ist lokal auf die storage Methode, weil Sie eine Marke newArrayList bei jedem Aufruf (auf storage()-Methode) zu schaffen, aber was Sie brauchen, ist ein staticArrayList Objekt auf Klassenebene, wie unten gezeigt , aber weil Sie storage() Methode mit einem Objekt aufrufen, ist dies keine bevorzugte Option (unten klar erklärt) und Compiler wirft bereits eine Warnung und Sie ignorieren es.

public class two { 

    private static ArrayList<String> al = new ArrayList<String>(); 

    public static void storage(String toBeAdded) 
    { 
     al.add(toBeAdded); 
     System.out.println(al); 
    } 
} 

Option (2) (Bevorzugen this): Entfernen Sie den static Umfang und erklären ArrayList<String> als Instanzvariable wie unten dargestellt (diese Option bevorzugen), weil Sie eine static Verfahren fordern einen Objektverweis verwendet, die ist nicht erforderlich und schafft Verwirrung.

public class two { 

     private ArrayList<String> al = new ArrayList<String>(); 

     public void storage(String toBeAdded) 
     { 
      al.add(toBeAdded); 
      System.out.println(al); 
     } 
    } 

muss immer sichergestellt, dass static Variablen/Methoden verwenden Klassennamen aufgerufen (wie Two.storage()), ohne irgendeinen Gegenstand zu schaffen, weil sie Klassenstufe Mitglieder d.h. sind, werden sie für ein einzelnes Objekt nicht gemeint. Ich empfehle Ihnen dringend, lesen Sie this und verstehen Sie dieses Thema klarer.


Abgesehen von oben wichtiger Punkt, immer sicher, dass Sie die Java Namensstandards wie Klassennamen folgen sollten mit Groß beginnen, die Sie verletzen.

+0

Oder noch besser, löschen Sie alle Vorkommen von 'static' aus Ihrem Code. – Bohemian

+0

Danke, Sie haben Recht – developer

2

Anstatt die ArrayList als lokale Variable zu deklarieren, verwenden Sie sie als Feld. Auch macht das Verfahren nicht-statische

public class two 
{ 

    private ArrayList<String> al = new ArrayList<String>(); 
    public void storage(String toBeAdded) 
    { 

     al.add(toBeAdded); 
     System.out.println(al); 
    } 
} 
1

Ihren Fehler

Jedes Mal, wenn Sie anrufen storage() Methode, Sie sind ein neues Objekt ‚Arraylist‘ zu schaffen.

Lösung

So ein Objekt der Klasse machen two und es alongwith die Zeichenfolge an die storage() Methode übergeben

import java.util.ArrayList; 
    public class one 
    { 
     public static void main (String [] args) 
     { 
      two t = new two(); 

      t.storage(t,"Hello, How Are You?"); 
      t.storage(t,"I'm fine. How Are You?"); 
     } 
    } 

    class two 
    { 
     ArrayList<String> al = new ArrayList<String>(); 
     public static void storage(two object,String toBeAdded) 
     { 


      object.al.add(toBeAdded); 
      System.out.println(object.al); 
     } 
    } 
0

in Ihrer Klasse two das Problem in der Methode storage Ihre Logik isn‘ t Bei jedem Speicheraufruf zum Speichern einer neuen Zeichenfolge erstellen Sie die neue Arraylist al, die alle vorherigen Informationen in der alten Arraylist löscht.

zu lösen, dass static Arraylist in der Klasse zwei und fügen Sie Informationen, die ihm von Methodenspeicher definieren:

public class two 
{ 
    public static ArrayList<String> al = new ArrayList<String>(); 

    public void storage(String toBeAdded) 
    { 
     al.add(toBeAdded); 
     System.out.println(al); 
    } 
} 

Hinweis: auch storage Methode sollte static Methode nicht sein, weil Sie ein Objekt der Klasse zu schaffen sind two und ruft die Methode durch dieses Objekt auf. Wenn Sie also versuchen, es zu testen, gibt es Ihnen eine Warnung:

Zugriff auf statische Methode Speicher

Grund der Warnung, dass Sie versuchen, auf die statische Methode storage in Ihrem Objekt t der Klasse two zuzugreifen.

, wenn Sie statische Methode in der Klasse den richtigen Weg erklären sie zu nennen:

ClassName.MethodName() 

in Ihrem Beispiel:

two.storage("Hello, How Are You?"); 
two.storage("I'm fine. How Are You?"); 
Verwandte Themen