Java无法识别来自其​​他类

时间:2017-10-26 19:48:33

标签: java find field symbols

所以我的java代码涉及定义一个对象构造函数类:

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

然后在处理用户输入后(在程序的main方法中)实例化该类。

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

但是,最后一行是抛出一个错误,说它找不到finalID变量的'symbol',尽管newID已被调用,它应该有一个finalID实例作为字段。谁能指出我在这里做错了什么?

这是错误:

  

Bookstore.java:100错误:找不到符号

     

的System.out.println(newID.finalID);

     

symbol:变量finalID

     

location:bookID类型的变量newID

4 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分:0)

首先,您的字段应该是该类的全局字段,并且最好声明为私有字段。

If ARange(1).Value = "John" Or _
   ARange(1).Value = "Thomson" Or _
   ARange(1).Value = "Mattson" Or _
   ARange(1).Value = "Powers" Or _
   ARange(1).Value = "Hermkens" Or _
   ARange(1).Value = "Licka" Or _
   ARange(1).Value = "Fout" Or _
   ARange(1).Value = "Marrin" Or _
   ARange(1).Value = "Fleming" Or _
   ARange(1).Value = "Waiblinger" Or _
   ARange(1).Value = "Lambertson" Or _
   ARange(1).Value = "Solis" Or _
   ARange(1).Value = "Deot" Or _
   ARange(1).Value = "Large" Or _
   ARange(1).Value = "Gannon" Or _
   ARange(1).Value = "FAUGHNAN" Or _
   ARange(1).Value = "COMPLIANCE" Or _
   ARange(1).Value = "Jacobs" Or _
   ARange(1).Value = "Powers" Or _
   ARange(1).Value = "TSH" Or _
   ARange(1).Value = "WRONG LOCATION CODE" Then

然后检修构造函数看起来像这样

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()并只创建一个Integer类型的字段,然后在其上调用方法toString()

答案 2 :(得分:0)

在面向对象的编程中,成员变量(java中的“fields”)通常不能在类的范围之外访问(在某些语言中它们是默认的,但在java中它们除非被声明为public,否则通常不会推荐的)。

如果您希望能够访问这些内容,则需要在类实现中公开“getter”或“setter”成员函数来执行此操作。例如,定义

public String getFinalID() {
    return finalID;
}

在你的bookID类中(也请遵循Java的命名约定,除非你被指示不要 - 这应该大写为BookID,因为它是一个类)将允许你在任何实例上读取finalID的值bookID类。处理用户输入后的代码将更改为

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

这样做是为了让您的公共用户无法直接访问您的类的内部,除非您特别允许。在这种情况下,通过使用getter,您不允许用户覆盖存储在finalID中的内容,如果他们可以通过执行如下所示的操作直接访问它们,那就可以了:

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

但是,如果你真的想通过实现一个setter方法,你当然可以做到这一点:

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

答案 3 :(得分:0)

您的代码中存在很多问题。

不能 静态

其次,对象的名称并不能很好地代表它。 一个好的开始可能是:

public class Book {}

您正在寻找说明 Book 可以由startAuthor,String startGenre,int startNumID定义。 对我来说,开始没有任何价值,也许有你的需要。 但我会说:

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

getter和setter的使用是 Java 中的约定 这是封装,记住它,当你理解逻辑时它总是一样的。

现在你可以使用它doint

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

然而,你写的这句话:

String author = startAuthor;

完全不同于

this.author=author;

在您的情况下,作者将在块指令结束时自由。 我想你想把它赋予book属性。 表示书籍的实例,因此 this.author 引用Book的属性,而没有this的作者则表示最接近的定义属性,即构造函数的参数。

最后,如果您的finalID是您的变量的组合。 我不明白为什么你需要保存它。 这取决于你需要什么以及你需要它,但如果你想描述你的对象,这就足够了。

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