这是主要的演示类
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方法时,它只会打印出我认为是内存地址的内容。我什至不去理会抽象类,它仍然这样做,有人知道为什么吗?还有一个关于抽象类的问题,它们带来什么好处,仅仅是内存?因为您无法通过它访问私有成员,所以它与普通课程不一样,只是有更多限制吗?
答案 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)
假设您有这样定义的类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
类具有{{1 }},没有从toString()
类继承的参数(Java中的每个类都继承Object类)。
然后在Son类中,我添加了新方法Object
,该方法有一个参数,使test(int testTime)
和test()
不同,称为方法test(int testTime)
。在您的overloading
类中,有两种ExtendsAbstract
方法,一种是继承自no-arg的方法,另一种是您定义的。
现在让我向您展示继承流程
对象--->摘要--->扩展摘要
对象类toString
方法将打印内存地址,我们可以在我们的类中重写它以更改其定义,您可以返回所需的任何字符串。但是无论在toString()
类还是Abstract
类中,您都没有覆盖它,因此在这两个类中,它将打印内存地址。
现在在您的ExtendsAbstract
类中,您将调用始终打印内存地址的Object类Ongoing
方法。您感到困惑的是,您认为自己已覆盖toString()
方法,但实际上您只是重载了该方法,而为期望的输出调用了错误的方法。