【问题标题】:Class that is extended from an abstract class toString method doesn't work :/从抽象类 toString 方法扩展的类不起作用:/
【发布时间】:2018-11-08 03:53:32
【问题描述】:

这是主要的演示类

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 方法时,它只会打印出我认为是内存地址的内容。我什至没有弄乱抽象类,它仍然这样做,有人知道为什么吗?还有一个关于抽象类的问题,它们带来了什么好处,仅仅是内存吗?因为你不能从中访问私有成员所以和普通类不一样,只是更多的限制?

【问题讨论】:

  • 您正在调用 toString 的 java.lang.Object 实现(所有 java 类都继承自此)。您的 toString 实现需要一个整数。

标签: java abstract


【解决方案1】:

假设你有类 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 类有toString(),没有从Object 类继承的参数( Java 中的每个类都继承 Object 类)。

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

现在让我展示一下继承流程

Object--->Abstract--->ExtendsAbstract

对象类toString()方法打印内存地址,我们可以在我们的类中重写它来改变它的定义,你可以返回任何你想要的字符串。但是您没有在 Abstract 类或 ExtendsAbstract 类中的任何地方覆盖它,因此在这两个类中它都会打印内存地址。

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

参考:Java overloading and overriding

【讨论】:

    【解决方案2】:

    目前,对象的 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) ;
    }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多