Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从抽象类扩展到字符串方法的类不';t工作:/_Java_Abstract - Fatal编程技术网

Java 从抽象类扩展到字符串方法的类不';t工作:/

Java 从抽象类扩展到字符串方法的类不';t工作:/,java,abstract,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

这是主要的演示类

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(),如下所示:
ClassName@HashCode

您可以这样做来打印:(在toString()处添加@Override)。另外,不需要调用josh.toString()。您只需调用
System.out.println(josh)(魔法将发生,它将调用toString)

“toString()”方法必须如下所示:

@Override
public String toString(){
     return("The integer is "+ y) ;
}
“@Override”注释用于编译器检查,不是必需的。
关于注释的更多信息:

假设您有这样定义的类
Dad
Son

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类)

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

现在让我向您展示继承流

对象-->抽象-->ExtendsAbstract

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

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


参考:

您正在调用toString的java.lang.Object实现(所有java类都继承自此)。您的toString实现需要一个整数。
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);
    }
}