VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1886|回复: 13

神奇的接口中处理 toString() 问题!!

[复制链接]

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-9-28 19:30:01 | 显示全部楼层 |阅读模式
今天突然发现这样一个问题 就是接口中好像也有默认的toString() 方法 象下面的这个例子:
interface test
{

}
public class TesttoString implements test
{
        private String s;
        public TesttoString(String str){
                s = str;
        }
        public String toString(){
                return s;
        }
        public String returnS(){
                return s;
        }
        public static void main(String[] args){
                test o = new TesttoString("I don't know!!");
                System.out.println(o);
                System.out.println(o.toString());
                System.out.println(((TesttoString)o).returnS());
                //System.out.println(o.returnS());

        }
}
我没有在接口中定义 toString() 方法 但是实现他的类 TesttoString 却可以向上转型付给 test 如果是 子类继承自父类的话 这个就好理解,类都是 Object 的子孙, 但是我好像没有在那本书上看见说接口 有这个功能的呀 ! 象o.returnS()这个调用会报错的,这个也好理解 但就是toString() 呀 !!!!
回复

使用道具 举报

1

主题

20

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-9-28 19:45:01 | 显示全部楼层
toString()是默认加载包java.lang包中类的方法
回复

使用道具 举报

0

主题

14

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-9-29 10:15:01 | 显示全部楼层
interface test has access to method toString(), this method is from class Object.

In class TesttoString, toString() method is overridden. When the program is running, the overridding toString() method in class TesttoString is called based on the object type instead of variable reference type.
回复

使用道具 举报

0

主题

14

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-9-29 10:30:01 | 显示全部楼层
interface test has access to method toString(), this method is from class Object.

This toString() method is overridden in class TesttoString. When the program is running, the overridding toString() method in class TesttoString is called based on the object type instead of variable reference type.
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-9-30 00:15:01 | 显示全部楼层
难道说接口也默认有 toString 吗
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-30 09:15:01 | 显示全部楼层
toString方法是定义在Object类中的!当然所有的类都会有这个方法!
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-30 09:30:01 | 显示全部楼层
Java中所有的类都默认继承于Object类,哪怕你在写class的时候并没有显示的继承Object类,Java编译器也会隐式的加上
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-30 10:30:02 | 显示全部楼层
这个现像的确很有趣,上面几位好像都没注意到一个问题,那就是这里的研究对像是“接口”,而不是“类”,而接口似乎在理论上是不可以继承Object类的

我对这个现象的理解是,JAVA中对于Object这个基类的处理是另外一套方式
并不是“所有类都继承了Object类,所以所有对象都拥有它的方法”
而是  “所有的对象都默认拥用Object类的方法,刚好看起来符合继承这条规则”

呵呵,大家一起研究研究
回复

使用道具 举报

0

主题

7

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-9-30 11:15:01 | 显示全部楼层
Sun的官方文档TJLS(The Java Language Specification)吧!其中第9章9.2节关于接口有这么一段话:

If an interface has no direct superinterfaces, then the interface implicitly
declares a public abstract member method m with signature s, return type r,
and throws clause t corresponding to each public instance method m with
signature s, return type r, and throws clause t declared in Object, unless a
method with the same signature, same return type, and a compatible throws
clause is explicitly declared by the interface. It is a compile-time error if the
interface explicitly declares such a method m in the case where m is declared to
be final in Object.


接口隐含定义了一套与Object类中的方法签名完全相同的方法;如果接口定义一个在Object中定义为final的会编译出错。
回复

使用道具 举报

1

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-9-30 11:45:01 | 显示全部楼层
接口好像真的隐含了 Object 中的一套方法 我做了下面一个 hashCode() 的测试
interface test
{

}
public class TesttoString implements test
{
        private String s;
        private int i;
        public TesttoString(String str,int j){
                s = str;
                i = j;
        }
        public String toString(){
                return i+" :  "+ s;
        }
        public String returnS(){
                return s;
        }
        public int hashCode(){
                return  i;
        }
        public static void main(String[] args){
                test o = new TesttoString("I don't know!!",1);
                System.out.println(o);
                System.out.println(o.toString());
                System.out.println(((TesttoString)o).returnS());
                System.out.println(o.hashCode());
                //System.out.println(o.returnS());

        }
}

结果可以输出 哈希玛 1 的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表