从抽象类toString方法扩展的类不起作用:/

时间:2018-11-08 03:53:33

标签: java abstract

这是主要的演示类

public class Ongoing{

  public static void main(String[] args){

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

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



  }

}

这是从抽象类扩展的类,使用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) ;

  }

}

这是抽象类

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


}

每次我尝试从扩展类访问toString方法时,它只会打印出我认为是内存地址的内容。我什至不去理会抽象类,它仍然这样做,有人知道为什么吗?还有一个关于抽象类的问题,它们带来什么好处,仅仅是内存?因为您无法通过它访问私有成员,所以它与普通课程不一样,只是有更多限制吗?

3 个答案:

答案 0 :(得分:0)

当前,发生的事情是调用对象的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) ;
}
}

答案 1 :(得分:0)

“ toString()”方法必须像这样:

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

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

答案 2 :(得分:0)

假设您有这样定义的类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类正在扩展Dad,因此没有参数的test()会继承到Son,就像您的ExtendsAbstract类具有{{1 }},没有从toString()类继承的参数(Java中的每个类都继承Object类)。

然后在Son类中,我添加了新方法Object,该方法有一个参数,使test(int testTime)test()不同,称为方法test(int testTime)。在您的overloading类中,有两种ExtendsAbstract方法,一种是继承自no-arg的方法,另一种是您定义的。

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

  

对象--->摘要--->扩展摘要

对象类toString方法将打印内存地址,我们可以在我们的类中重写它以更改其定义,您可以返回所需的任何字符串。但是无论在toString()类还是Abstract类中,您都没有覆盖它,因此在这两个类中,它将打印内存地址。

现在在您的ExtendsAbstract类中,您将调用始终打印内存地址的Object类Ongoing方法。您感到困惑的是,您认为自己已覆盖toString()方法,但实际上您只是重载了该方法,而为期望的输出调用了错误的方法。

参考:Java overloading and overriding