2017-10-26 11 views
0

をフィールドを認識しないので、私のJavaコードは、オブジェクトのコンストラクタクラスの定義が含まれます。は、Java他のクラスから

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

はしかし、最後の行は、それがNEWIDがすでに呼び出されているにもかかわらず、finalID変数の「シンボルを見つけることができない」と、それはフィールドとしてfinalIDのインスタンスを持つべきであると言って、エラーを投げています。誰でも私がここで間違っていることを指摘できますか?

はここでエラーです:

Bookstore.java:100 error: cannot find symbol

System.out.println(newID.finalID);

symbol: variable finalID

location: variable newID of type bookID

+2

これは、 'finalID'が' bookID'クラスの変数ではないためです。これは 'bookID'コンストラクタのローカル変数です。 – azurefrog

+0

[ローカル変数、インスタンスフィールド、入力パラメータ、およびクラスフィールドの違いは何ですか](https://stackoverflow.com/q/20671008) – Pshemo

答えて

0

finalIDはそれを行うためのグローバルパブリック変数である必要があります。またはgetメソッドでプライベート。

前者の場合、newID.finalIDを呼び出すことができます。 getterを使用すると、newID.getFinalID();を呼び出すことができます。

方法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); 
    } 
} 

方法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

まず、あなたのフィールドはクラスのグローバルであることができ、好ましくはプライベート宣言しなければなりません。 (

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

はまた、あなたが持つInteger.toStringを使用しないようにラッパーを使用することができます。

public class bookID{ 

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

は、その後、最終的慣習、次のフィールドのgetterを作成するには、この

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

に見えるようにコンストラクタをオーバーホール)、Integer型のフィールドを作成してからtoString()メソッドを呼び出してください。

0

オブジェクト指向プログラミングでは、メンバ変数(javaの "fields")は一般にクラスのスコープ外ではアクセスできません(いくつかの言語ではデフォルトではありますが、javaでは一般には宣言されていない限り。

これらのものにアクセスできるようにするには、クラスの実装内でパブリック "getter"または "setter"メンバ関数を作成する必要があります。あなたが読むことができます - たとえば、あなたbookIDクラス内

public String getFinalID() { 
    return finalID; 
} 

を定義する(それはクラスがあるので、これはBookIDとして資産計上しなければならないもあなたがいないように指示している場合を除き、Java用の命名規則に従ってください) bookIDクラスのインスタンスのfinalIDの値。ユーザーの入力を処理した後、あなたのコードは、あなたが特別に許可しない限り、あなたの公開、ユーザーが自分のクラスの内部に直接アクセスすることがないように、これが行われ

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

に変更します。

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

しかし、もちろん、あなたはまだ達成することができます。この場合、ゲッターを使用することにより、ユーザーが、彼らは、以下に示すような何かを行うことによって直接アクセスしていた場合、彼らは可能性のようなfinalIDに保存されているものを上書きすることはできません。これは、セッターメソッドを実装して本当にしたい場合:

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

あなたのコードには多くの問題があります。

クラスは第二に、あなたのオブジェクトの名前がそれをよく表しているわけではありません静的

することはできません。 良いスタートは次のようになります。あなたはあなたのブックはstartAuthor、文字列startGenre、int型startNumIDで定義することができると言うことを探している

public class Book {} 

。 私の場合、スタートにはセメント値がありません。あなたの必要性があるかもしれません。 しかし、私は言う:あなたはロジックを理解したときに、これはカプセル化され

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; 
    } 
} 

ゲッターとセッターの使用方法は、Java のコンベンションである心の中でそれを維持する、それは常に同じです。

は今、あなたはそれは、しかし、あなたが書いたこのライン

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

をdoint使用することができますあなたの場合は

this.author=author; 

とは全く異なっている

String author = startAuthor; 

を、著者は次のようになりますブロック命令の最後に空きがあります。 あなたはそれをブック属性に書いておきたいと思います。 このは本のインスタンスを表します。this.authorこれは、蔵書の属性を参照していますが、これはコンストラクタのパラメータである最も近い定義済みの属性を表しています。

最後に、finalIDが変数の組み合わせである場合。 保存が必要な理由がわかりません。 それは必要なものと必要なものによって異なりますが、オブジェクトを説明するだけで十分です。

@Override 
public String toString() { 
    return author+genre+id; 
} 
関連する問題