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");
}
}