从抽象 class toString 方法扩展而来的 Class 不起作用:/

Class that is extended from an abstract class toString method doesn't work :/

这是主要演示 class

public class Ongoing{

  public static void main(String[] args){

    ExtendsAbstract josh = new ExtendsAbstract(5, "donkey");

    System.out.println(josh.toString());



  }

}

这是从抽象class扩展而来的class,那个tostring方法不行。

public class ExtendsAbstract extends Abstract{

  private String t;

  public ExtendsAbstract(int y, String t){
    super(y);
    this.t = t;
  }

  public String getString(){
    return this.t;  
  }

  public int getInt(){
    return super.getInt();
  }

  public String toString(int y){

    return(/*super.toString(y)+*/"The integer is "+ y) ;

  }

}

这是摘要class

public abstract class Abstract{

  private int y;


  public Abstract(int y){
    this.y = y;
  }

  public int getInt(){
    return y;
  }

  public String toString(int y){
    return("The integer is :"+y);
  }


}

每次我尝试从扩展 class 访问 toString 方法时,它只会打印出我认为是内存地址的内容。我什至没有弄乱摘要 class 但它仍然这样做,有人知道为什么吗?还有一个关于abstract classes的问题,它们带来了什么好处,难道只是记忆?因为你不能从它访问私有成员所以它不是和普通的一样吗class,只是更多的限制?

目前,正在调用对象的 toString(),如下所示:ClassName@HashCode

您可以这样做来打印:(在 toString() 处添加一个@Override)。此外,无需调用 josh.toString()。您可以简单地调用 System.out.println(josh);(魔术会发生,它会调用 toString)..

public class ExtendsAbstract extends Abstract{

private String t;

public ExtendsAbstract(int y, String t){
 super(y);
 this.t = t;
}

 public String getString(){
   return this.t;  
}

public int getInt(){
return super.getInt();
}

@Override
public String toString(int y){

return(/*super.toString(y)+*/"The integer is "+ y) ;
}
}

"toString()"方法必须是这样的:

@Override
public String toString(){
     return("The integer is "+ y) ;
}

“@Override”注释用于编译器检查,不是强制性的。 有关此处注释的更多信息:https://docs.oracle.com/javase/7/docs/api/java/lang/Override.html

假设你有 classes DadSon 是这样定义的

public class OverLoadedToString {

    public static void main(String[] args) {
        Son son = new Son();
        son.test();
        son.test(90);
    }
}

class Dad {

    void test() {
        System.out.println("Dad - test");
    } 
}

class Son extends Dad {

    void test(int testTime) {
        System.out.println("Son - test1" + testTime);
    }
}

Son class 正在扩展 Dad,因此没有参数的 test() 会继承到 Son,就像您的 ExtendsAbstract class 的 toString() 没有继承自 Object class 的参数(Java 中的每个 class 都继承对象 class)。

然后在 Son class 我添加了新方法 test(int testTime),它有一个参数,这使得 test()test(int testTime) 不同,它被称为方法 overloading.在您 ExtendsAbstract class 中有两种 toString 方法,一种是继承的无参数方法,另一种是您定义的方法。

现在让我向您展示继承流程

Object--->Abstract--->ExtendsAbstract

Object class toString() 方法打印内存地址,我们可以在我们的 classes 中覆盖它来改变它的定义,你可以 return 你想要的任何字符串想。但是你没有在 Abstract class 或 ExtendsAbstract class 中的任何地方覆盖它,所以在这两个 classes 中它都会打印内存地址。

现在,在您的 Ongoing class 中,您正在调用始终打印内存地址的对象 class toString() 方法。你的困惑是你认为你已经覆盖了 toString() 方法但实际上你只是重载了它并且你正在为你的预期输出调用错误的方法。

参考:Java overloading and overriding