[英]Class that is extended from an abstract class toString method doesn't work :/
这是主要的演示类
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)..
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
假设您有类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类)。
然后在Son类中我添加了新方法test(int testTime)
,它有一个参数,使test()
和test(int testTime)
不同,称为方法overloading
。 在你的ExtendsAbstract
类中有两个toString
方法,一个是no-arg继承而另一个是你定义的。
现在让我告诉你继承流程
对象--->抽象---> ExtendsAbstract
对象类toString()
方法打印内存地址,我们可以在我们的类中重写它来改变它的定义,你可以返回你想要的任何字符串。 但是你没有在Abstract
类或ExtendsAbstract
类中的任何地方重写它,所以在这两个类中它都会打印内存地址。
现在在你的Ongoing
类中,你调用的是Object类toString()
方法,该方法总是打印内存地址。 您的困惑在于您认为已经覆盖了toString()
方法,但实际上您刚刚重载它并且您正在为您的预期输出调用错误的方法。
参考: Java重载和覆盖
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.