2017-10-26 3 views
0

Also mein Java-Code eines Objekt Konstruktor Klasse umfasst die Definition:Java nicht von anderer Klasse zu erkennen Feld

public static class bookID{ 
    bookID(String startAuthor, String startGenre, int startNumID){ 
     String author = startAuthor; 
     String genre = startGenre; 
     int numID = startNumID; 
     String finalID = author + genre + Integer.toString(numID); 
    } 
} 

Und dann instanziieren die Klasse nach der Eingabe des Benutzers Verarbeitung (im Hauptverfahren des Programms).

bookID newID = new bookID(authFinal, genre, numID); 
books.add(newID); 
System.out.println(newID.finalID); 

jedoch die letzte Zeile einen Fehler wirft, sagen, es der finalID Variable ‚nicht Symbol finden können‘, trotz newID bereits genannt zu werden, und es sollte eine Instanz von finalID als ein Feld haben. Kann jemand darauf hinweisen, was ich hier falsch mache?

Hier ist der Fehler:

Bookstore.java:100 error: cannot find symbol

System.out.println(newID.finalID);

symbol: variable finalID

location: variable newID of type bookID

+2

Das liegt daran, 'finalID' ist keine Variable in der' bookID' Klasse. Es ist eine lokale Variable im Konstruktor 'bookID'. – azurefrog

+0

[Was ist der Unterschied zwischen einer lokalen Variablen, einem Instanzfeld, einem Eingabeparameter und einem Klassenfeld?] (Https://stackoverflow.com/q/20671008) – Pshemo

Antwort

0

finalID braucht eine globale öffentliche Variable zu sein, das zu tun. Oder privat mit einer Get-Methode.

Wenn Sie erstere ausführen, können Sie newID.finalID aufrufen. Mit dem Getter können Sie newID.getFinalID();

Methode 1:

public static class bookID{ 
    public String finalID; 
    bookID(String startAuthor, String startGenre, int startNumID){ 
     String author = startAuthor; 
     String genre = startGenre; 
     int numID = startNumID; 
     finalID = author + genre + Integer.toString(numID); 
    } 
} 

Methode 2:

public static class bookID{ 
     private String finalID; 
     bookID(String startAuthor, String startGenre, int startNumID){ 
      String author = startAuthor; 
      String genre = startGenre; 
      int numID = startNumID; 
      finalID = author + genre + Integer.toString(numID); 
     } 

     getFinalID(){ 
      return finalID; 
     } 
    } 
0

zuerst Ihre Felder sollten für die Klasse und vorzugsweise global erklärt privat.

public class bookID{ 

    private String author; 
    private String genre; 
    private int numID; 
    private String finalID; 

Dann Konstruktor überarbeiten wie diese der Konvention folgende

bookID(String startAuthor, String startGenre, int startNumID){ 
    this.author = startAuthor; 
    this.genre = startGenre; 
    this.numID = startNumID; 
    this.finalID = author + genre + Integer.toString(numID); 
} 

schließlich schaffen Getter für Felder suchen:

public String getAuthor(){ 
    return this.author; 
} 

auch können Sie den Wrapper verwenden, um zu vermeiden Integer.toString mit () und erstellen Sie einfach ein Feld vom Typ Integer und rufen Sie dann die Methode toString() auf es

0

In der objektorientierten Programmierung sind Membervariablen ("Felder" in Java) nicht allgemein zugänglich außerhalb des Bereichs der Klasse (in einigen Sprachen sind sie standardmäßig, aber in Java sind sie nicht öffentlich, was normalerweise nicht empfohlen wird) .

Wenn Sie auf diese Dinge zugreifen möchten, müssen Sie die "Getter" - oder "Setter" -Mitgliedfunktionen innerhalb Ihrer Klassenimplementierung veröffentlichen. Zum Beispiel

public String getFinalID() { 
    return finalID; 
} 

innerhalb Ihrer BookID Klasse definieren (auch folgen Sie bitte Konventionen für Java zu benennen, es sei denn Sie angewiesen sind nicht zu - dies sollte als BookID aktiviert werden, da es eine Klasse ist) ermöglicht es Ihnen, das lesen Wert von finalID für jede Instanz der bookID-Klasse. Ihr Code nach der Verarbeitung von Benutzereingaben würde

bookID newID = new bookID(authFinal, genre, numID); 
books.add(newID); 
System.out.println(newID.getFinalID()); //<-- notice the change here 

zu

ändert Dies geschieht, so dass Ihr öffentlicher Benutzer keinen direkten Zugriff auf die Interna Ihrer Klassen hat, wenn Sie dies ausdrücklich erlauben.In diesem Fall wird durch einen Getter mit erlauben Sie nicht dem Benutzer zu überschreiben, was in finalID gespeichert ist, wie könnte sie, wenn sie von etwas zu tun, wie unten direktem Zugang hat gezeigt:

bookID newID = new bookID(authFinal, genre, numID); 
books.add(newID); 
newID.finalID = "something else"; 

Aber natürlich kann man noch erreichen dies, wenn Sie wirklich möchten, indem Sie eine Setter-Methode implementieren:

public void setFinalID(newFinalID) { 
    finalID = newFinalID; 
} 
0

Es gibt eine Menge Probleme in Ihrem Code.

Klasse kann nicht sein statische

Zweitens nicht der Name des Objekts es gut vertreten. Ein guter Anfang sein könnte:

public class Book {} 

Sie suchen zu sagen, dass Ihr Buch durch eine startAuthor, String startGenre definiert werden, int startNumID. Für mich hat Start keinen sementischen Wert, vielleicht gibt es für Ihre Bedürfnisse. Aber ich würde sagen:

public class Book { 
    private String author; 
    private String genre; 
    private String id; 

    public Book(String author, String genre, String id) { 
      this.author=author; 
      this.genre=genre; 
      this.id=id; 
    } 

    public String getId(){ 
      return this.id; 
    } 
    public String getAuthor(){ 
      return this.author; 
    } 
    public String getGenre(){ 
      return this.genre; 
    } 
} 

Die Verwendung von Getter und Setter ist eine Konvention in Java Diese Kapselung ist, denken Sie daran, es ist immer das gleiche, wenn Sie die Logik zu verstehen.

Jetzt können Sie es

Book book = new Book(); 
book.getId(); 

jedoch diese Zeilen doint verwenden, die Sie schrieb:

String author = startAuthor; 

ist völlig anders als

this.author=author; 

In Ihrem Fall wird Autor sein frei am Ende der Blockanweisung. Ich denke, Sie möchten es dem Buchattribut geben. Diese stellt eine Instanz eines Buches so this.author beziehen sich auf das Attribut des Buches, während der Autor ohne dies das am nächsten definierte Attribut, das der Parameter des Konstruktors ist.

Schließlich, wenn Ihre finalID eine Kombination Ihrer Variablen ist. Ich verstehe nicht, warum Sie es speichern müssen. es hängt davon ab, was Sie brauchen und wie Sie es brauchen, aber wenn Sie nur Ihr Objekt beschreiben möchten, ist dies genug.

@Override 
public String toString() { 
    return author+genre+id; 
}