Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 CharSequence接口的toString()方法与Object类的区别_Java - Fatal编程技术网

Java CharSequence接口的toString()方法与Object类的区别

Java CharSequence接口的toString()方法与Object类的区别,java,Java,CharSequence接口中的toString()方法与Object类中的toString()方法之间的真正区别是什么 我知道String类默认实现CharSequence并扩展Object类 但是String类是否实现了CharSequence中的toString()?如果是,那么在打印String时调用toString()的哪个版本?toString()方法是在CharSequence接口中定义的,它没有实现。这样做是为了添加有关CharSequence实现需要遵循的需求的相关文档 具体而

CharSequence
接口中的
toString()
方法与
Object
类中的
toString()
方法之间的真正区别是什么

我知道
String
类默认实现
CharSequence
并扩展
Object

但是
String
类是否实现了
CharSequence
中的
toString()
?如果是,那么在打印
String
时调用
toString()
的哪个版本?

toString()
方法是在
CharSequence
接口中定义的,它没有实现。这样做是为了添加有关
CharSequence
实现需要遵循的需求的相关文档

具体而言(Java 8 Update 141),
CharSequence
中的定义是:

这描述了
toString()
对于
CharSequence
实现必须如何操作

将其与
对象中的javadoc进行对比:

/**
*返回对象的字符串表示形式。总的来说
*{@code-toString}方法返回一个
*“文本表示”此对象。结果应该是
*简洁但信息量大的表达方式,便于读者理解
*要阅读的人。
*建议所有子类重写此方法。
*
*类{@code Object}的{@code toString}方法
*返回一个字符串,该字符串由
*对象是一个实例,at符号字符“{@code@}”,和
*的哈希代码的无符号十六进制表示形式
*反对。换句话说,此方法返回一个字符串,该字符串等于
*价值:
* 
* 
*getClass().getName()+'@'+Integer.toHexString(hashCode())
* 
*
*@返回对象的字符串表示形式。
*/
公共字符串toString()
toString()
方法在
CharSequence
接口中定义,未实现。这样做是为了添加有关
CharSequence
实现需要遵循的需求的相关文档

具体而言(Java 8 Update 141),
CharSequence
中的定义是:

这描述了
toString()
对于
CharSequence
实现必须如何操作

将其与
对象中的javadoc进行对比:

/**
*返回对象的字符串表示形式。总的来说
*{@code-toString}方法返回一个
*“文本表示”此对象。结果应该是
*简洁但信息量大的表达方式,便于读者理解
*要阅读的人。
*建议所有子类重写此方法。
*
*类{@code Object}的{@code toString}方法
*返回一个字符串,该字符串由
*对象是一个实例,at符号字符“{@code@}”,和
*的哈希代码的无符号十六进制表示形式
*反对。换句话说,此方法返回一个字符串,该字符串等于
*价值:
* 
* 
*getClass().getName()+'@'+Integer.toHexString(hashCode())
* 
*
*@返回对象的字符串表示形式。
*/
公共字符串toString()

如果超级类和超级接口中有两个具有相同签名的方法,则子类将继承来自超级类的方法,并使用它重写从超级接口继承的方法。
你可以参考这个演示

interface I1 {
    int foo();
}
interface I2 {
    int foo();
}
class C implements I1, I2 {
    int foo() {
        System.out.println("bar");
    }
}

如果超级类和超级接口中有两个具有相同签名的方法,则子类将继承来自超级类的方法,并使用它重写从超级接口继承的方法。
你可以参考这个演示

interface I1 {
    int foo();
}
interface I2 {
    int foo();
}
class C implements I1, I2 {
    int foo() {
        System.out.println("bar");
    }
}
从您的问题“调用了哪一个?”,听起来好像您认为有两个独立的
toString
方法:一个来自
CharSequence
,另一个来自
Object
。事实并非如此。在Java中,具有相同名称的方法是相同的方法,无论它是从一个、两个还是多个接口实现方法

例如:

在Java中,只有一个方法
foo()
,而不管它是通过interace I1还是I2实现的。与C#相比,C#可以给出两种不同的
foo()
实现:每个接口一种

具体来看您的问题,当您编写一个实现
CharSequence
的类时,您需要重写
toString
方法。但是,唯一能让您这样做的是文档。如果不重写它,您将继承
Object.toString
。如果您重写它,您将重写一个且唯一一个
toString
方法,因为正如我上面所示,
Object.toString
CharSequence.toString
没有区别。

与您的问题“调用了哪一个?”,听起来好像您认为有两种不同的
toString
方法:一种来自
CharSequence
,另一种来自
Object
。事实并非如此。在Java中,具有相同名称的方法是相同的方法,无论它是从一个、两个还是多个接口实现方法

例如:

在Java中,只有一个方法
foo()
,而不管它是通过interace I1还是I2实现的。与C#相比,C#可以给出两种不同的
foo()
实现:每个接口一种

具体来看您的问题,当您编写一个实现
CharSequence
的类时,您需要重写
toString
方法。但是,唯一能让您这样做的是文档。如果不重写它,您将继承
Object.toString
。如果您确实重写了它,您将重写一个也是唯一一个
toString
方法,因为正如我上面所示,
Object.toString
    public class Demo {
        public static void main(String args[]) {
            SubClass subClass = new SubClass();
            subClass.printA();  // I inherit from SuperClass
            subClass.printB();  // I inherit from SuperClass
        }
    }


    class SuperClass{
        public void printA(){
            System.out.println("I inherit from SuperClass");
        }

        public void printB(){
            System.out.println("I inherit from SuperClass");
        }
    }

    interface SuperInterface{
        public default void printA(){
            System.out.println("I inherit from SuperInterface");
        };

        void printB();
    }

    class SubClass extends SuperClass implements SuperInterface{
        // No need to override printB() of SuperInterface, 
        // as already inherited one from SuperClass
    }
interface I1 {
    int foo();
}
interface I2 {
    int foo();
}
class C implements I1, I2 {
    int foo() {
        System.out.println("bar");
    }
}