所以我的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
答案 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;
}