【问题标题】:overriding tostring() method and passing object reference without getting hash覆盖 tostring() 方法并传递对象引用而不获取哈希
【发布时间】:2017-12-03 19:52:04
【问题描述】:

我正在尝试覆盖 toString() 方法并在没有哈希的情况下打印。当我在尝试打印时使用我的tostring() 方法时,它需要我创建另一个对象,例如asset server = new asset();。当我这样做并仅使用server 时,它会返回默认构造函数,或者当我使用server[i] 时会出错。我写的代码返回这个:

 `ant -f C:\\Users\\kalle\\Documents\\NetBeansProjects\\assign7 -
  Dnb.internal.action.name=run run
  init:
  Deleting: C:\Users\kalle\Documents\NetBeansProjects\assign7\build\built-
  jar.properties
  deps-jar:
  Updating property file: 
  C:\Users\kalle\Documents\NetBeansProjects\assign7\build\built-
  jar.properties
  compile:
  run:
  server switch etc.
  0
  vendor model number
  serial number
  1

  driver.asset@15db9742
  server
  server0
  10
  a1
  1
   driver.asset@15db9742
   server
  server1
  20
  a2
  1
  BUILD SUCCESSFUL (total time: 0 seconds)`

这是我的代码:`

 package driver;

public class Driver {

    public static void main(String[] args) {
        int i;
        asset basic = new asset();
        asset[] server = new asset[2];
        server[0]= new asset("server", 10, "server0", "a1", 1);
        server[1]= new asset("server", 20, "server1", "a2",1);
        for (i=0;i<server.length;i++){
            System.out.println(basic);
            System.out.println(server[i].Type);
            System.out.println(server[i].Name);
            System.out.println(server[i].ID);
            System.out.println(server[i].Serial);
            System.out.println(server[i].PID);
        }
    }
}

public class asset {
    String Type;
    int ID;
    String Name;
    String Serial;
    int PID;
    int i;

    public String getType(){
        return Type;
    }

    public void setType(String Type){
        this.Type = Type;
    }

    public int getID(){ 
        return ID;
    }

    public void setID(int getid){
        Integer.toString(ID);
        this.ID= ID;
    }

    public String getName(){
        return Name;
    }

     public void setName(String Name){
         this.Name = Name;
     }

     public String getSerial(){
         return Serial;
     }

    public void setSerial(String Serial){
        this.Serial = Serial;
    }

    public int getPID() {        
        return PID;    
    }

    public void setPID(int getPID) {
        Integer.toString(PID);
        this.PID= PID;     
    }

    public asset(){
        Name ="vendor model number";
        ID =0;
        Serial ="serial number";
        Type ="server switch etc.";
        PID =1;
        System.out.println( Type + "\n " + ID + "\n " + Name + "\n " + Serial + "\n " + PID + "\n ");}

        asset(String Type, int ID, String Name, String Serial, int PID){
        this.Type= Type;
        this.Name= Name;
        this.PID= PID;
        this.Serial= Serial;
        this.ID= ID;        
    }

    public String toString (asset[] a){
        getType();
        getID();
        setID(ID);
        getName();
        getSerial();
        getPID();
        setPID(PID);

       return this.Type + " " + this.ID + " " + this.Name + " " + this.Serial + " " + this.PID + " ";
    }
}

如何摆脱“driver.asset@15db9742”。

【问题讨论】:

  • Object.toString 不接受任何参数。
  • 你的代码格式很糟糕,而且你没有遵循 Java 命名约定(asset,作为一个类,应该称为Asset)。你在使用 IDE 吗?
  • 最诡异的是toString方法中的a参数无处……
  • 您没有正确覆盖 toString。方法的签名应该是public String toString()

标签: java arrays object reference overriding


【解决方案1】:

重写toString 方法的正确方法是具有以下结构:

public String toString(){
    // return String type
}

为您服务(致电getXY() 一个人不会做任何事情):

public String toString (){  
   return this.Type + " " + this.ID + " " + this.Name + " " + this.Serial + " " + this.PID + " ";
}

另外,为了遵守约定,你最好:

  • CamelCase 中命名类:asset -> Asset
  • 名称属性(&参数&变量)遵循camelCasetypeidnamepid

【讨论】:

    【解决方案2】:

    试试这个:

    int i;
    asset basic = new asset();
    asset[] server = new asset[2];
    server[0]= new asset("server", 10, "server0", "a1", 1);
    server[1]= new asset("server", 20, "server1", "a2",1);
    System.out.println(basic); // just delete this line.
    for (i=0;i<server.length;i++)
    {
    System.out.println(server[i].Type);
    System.out.println(server[i].Name);
    System.out.println(server[i].ID);
    System.out.println(server[i].Serial);
    System.out.println(server[i].PID);}
    
    }
    

    您一直打印出 basic 的值,这可能是它生成字符串哈希名称而不是实际存储值的原因。只需使用 System.out.println(basic);退出for循环?更好的是,完全删除该行!

    【讨论】:

    • 你太棒了,谢谢你。但是为什么我有一个问题,为什么它会打印出默认构造函数而不告诉它呢?
    • 因为你没有调用你的覆盖 .toString() 方法。这个链接应该有帮助:geeksforgeeks.org/overriding-tostring-method-in-java
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多