据我所知,toString()是在Object类中定义的,它是所有类层次结构的根。但toString()返回一个String类对象。并通过定义继承Super-class cant访问子类的方法。
所以我的问题是Object类如何返回一个无法访问的类型?
编辑: 我试过这个程序
class Super{
Sub obj = new Sub();
void call(){
obj.print();
}
}
class Sub extends Super{
int a=10;
void print(){
System.out.println("Hello\n "+a);
}
}
public class one{
public static void main(String args[]){
Super supobj = new Super();
supobj.call();
}
}
输出
at Super.<init>(one.java:2)
at Sub.<init>(one.java:8)
at Super.<init>(one.java:2)
at Sub.<init>(one.java:8)
at Super.<init>(one.java:2)
at Sub.<init>(one.java:8)
这一直在重复。这就是为什么我认为这不可能 @Max Vollmer
答案 0 :(得分:1)
Java不是C ++。在父类中创建子类的新实例是完全有效的。
//编辑: 在更新的示例中,您创建了一个无限递归,因为您在构造函数中创建子类Sub
的实例。超级Super
。子类调用它的父级构造函数,它将创建另一个Sub
实例,依此类推。但这与父类无法访问子类无关,它只是简单的无限递归。如果你只是在Super
的构造函数中创建一个新的Super
,你会得到相同的结果:
class Super {
Super obj = new Super();
}
你可以做的是:
class Super {
void call() {
Sub obj = new Sub();
obj.print();
}
}
或:
class Super {
Sub obj;
void call() {
obj.print();
}
void createSub() {
obj = new Sub();
}
}
然后在main:
public static void main(String args[]){
Super supobj = new Super();
supobj.createSub();
supobj.call();
}
答案 1 :(得分:-1)
通过定义继承超类cant访问方法的子类。
这不太正确。
Object
无法(轻松)访问该对象实例的String
方法,因为该对象甚至可能不是{{1} }。但是,如果它创建 new String
,它可以访问该新对象上的任何String
方法,并将其返回。
String
不返回对象本身。它返回一个新的object.toString()
。 (String
返回字符串本身,就像有人指出的那样,但无论如何都不在Object类中。)