当string是Object的子类时,toString()如何返回字符串?

时间:2018-03-23 16:43:10

标签: java oop inheritance

据我所知,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

2 个答案:

答案 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类中。)

相关问题