没有理论和事实依据,完全是想当然的“分析”。 记住一点:Object类是所有类的超类。如果一个类没有直接继承任何类,那么它就必然继承自Object。所以,class A { },其实相当于class A extends Object {};同样地,class A implements B { },也就相当于class A extends Object implements B { },还不明白吗?
越看越糊涂,接口真的能调Object里面的方法嘛??
没怎么明白 Object类是所有类的超类啊。 还是不明白
没怎么明白 Object类是所有类的超类啊。 还是不明白
class A extends Object 这个是重点。Object有print函数的
Object类是Java语言的根类,Java语言中,所有的类都直接或间接继承与它
想想单根继承,任何类都继承自Object。应该说任何东西都继承自Object。
答:1楼 Dan1980兄弟的理解完全正确,即: class A implements B { },也就相当于class A extends Object implements B { }
不是这个问题,我知道所有的类继承或者间接继承,我是说 接口通过什么方式调用Object类里面的方法interface A { } class B implements A{ //为了让大家看清楚问题,我重写了toString()方法,并显式调用它 public String toString() { return "B"; } } //这里隐式的继承了Object,这个我知道,但我不是问这个public class Test { A test = new B(); //多态机制,大家都知道编译时候会到A里面检查是否有toString()方法 //显然A里面声明了toString()方法,但是并没有继承Object()类,因为 //接口无法继承类, //A里面没有声明toString()方法,但是编译不出错 System.out.println(test.toString()); }我的问题是讨论下,接口A里面确实存在Object里面的方法,但是是通过方式 请大家仔细研究下,我只是觉得这个问题很有价值,仅做讨论(因为我知道 这个里面的细节对于java程序员知道的)
(因为 这个里面的细节对于java程序员来说很少有人知道的)
郑重声明:接口无法不能继承类,即接口跟Object类是独立的,具体问题请看11楼
其实一楼分析的很清楚了。 你的问题是:接口通过什么方式调用Object类里面的方法??A test = new B(); 因为Object是超类,这里new之后(实例化过程),当然应该有了。
A test = new B(); //多态机制,大家都知道编译时候会到A里面检查是否有toString()方法 //显然A里面声明了toString()方法,但是并没有继承Object()类,因为 //接口无法继承类, //A里面没有声明toString()方法,但是编译不出错 System.out.println(test.toString());因为编译器,运行器都会肯定test一定直接或者间接的继承Object对象(无论它实现了接口与否),所以必然存在了toString方法
23楼正解 ------------------------------ 你在Ide中定义接口看看interface A { // ide 报错: // The return type is incompatible with Object.toString() // 返回类型与Object.toString()不匹配 public int toString(); // 返回类型是int报错,需要String类型 } //(a)接口A中的方法成员两部分:1)你自己定义的 2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式).
记住一点:Object类是所有类的超类。如果一个类没有直接继承任何类,那么它就必然继承自Object。所以,class A { },其实相当于class A extends Object {};同样地,class A implements B { },也就相当于class A extends Object implements B { },还不明白吗?
Object类是所有类的超类啊。
还是不明白
Object类是所有类的超类啊。
还是不明白
接口通过什么方式调用Object类里面的方法interface A { }
class B implements A{
//为了让大家看清楚问题,我重写了toString()方法,并显式调用它
public String toString() {
return "B";
}
} //这里隐式的继承了Object,这个我知道,但我不是问这个public class Test {
A test = new B();
//多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
//显然A里面声明了toString()方法,但是并没有继承Object()类,因为
//接口无法继承类,
//A里面没有声明toString()方法,但是编译不出错
System.out.println(test.toString());
}我的问题是讨论下,接口A里面确实存在Object里面的方法,但是是通过方式
请大家仔细研究下,我只是觉得这个问题很有价值,仅做讨论(因为我知道
这个里面的细节对于java程序员知道的)
这个里面的细节对于java程序员来说很少有人知道的)
郑重声明:接口无法不能继承类,即接口跟Object类是独立的,具体问题请看11楼
你的问题是:接口通过什么方式调用Object类里面的方法??A test = new B(); 因为Object是超类,这里new之后(实例化过程),当然应该有了。
1)接口A里面没有声明toString()方法,但是接口A中,toString()方法是接口A中的方法成员.(即:Object类中的每一个public的实例方法,都是接口的方法成员(当然是public abstract形式)[JLS讲得很清楚 见JLS9.2节 "接口中的方法成员"),这才是编译不出错的真正原因2)test的类型是接口A,但test中运行时真正所指的对象(即:引用test的定义类型是接口A,但其运行时的所指的对象类型是 类B)是类B的对象,因而
test.toString()所调用的是运行时所指对象即类B的对象中的toString()方法,,若类B对象没有重写toString()方法,则自动调用是类B的父类Object类的对象的toString()方法了.
- 一句话,就是一个方法重写,运行时是如何调用的.
我是说,接口通过什么方式调用Object类里面的方法?
是这个意思吗?
//多态机制,大家都知道编译时候会到A里面检查是否有toString()方法
//显然A里面声明了toString()方法,但是并没有继承Object()类,因为
//接口无法继承类,
//A里面没有声明toString()方法,但是编译不出错
System.out.println(test.toString());因为编译器,运行器都会肯定test一定直接或者间接的继承Object对象(无论它实现了接口与否),所以必然存在了toString方法
(a)接口A中的方法成员两部分:1)你自己定义的 2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式).
(b)类B实现了接口A,则类B的任务是:1)重写(a)中1)处的方法 2)重写(a)中2)处的方法
又由于:类B实现了接口A 就是:类B extends Object implements 接口A,
则:类B的任务:1)重写(a)中1)处的方法 由类B自己来完成 而:)重写(a)中2)处的方法 实际上是由Object类完成的,不是由类B自己来完成的.,当然类B自己随时可以再重写.
(c)所有通过接口A调用Object类的方法,是由实现接口A的类B的对象来进行的(因为它:重写了接口A中的所有的方法(包括:来自于Object类的对应的抽象方法)) 这就是:通过接口A调用Object类的方法的内部过程--就是类B实现接口A(隐含实现了来自于Object类的对应的抽象方法)[你真该认真看看<<JAVA语言规范>>(9.2节接口中的方法成员)]
------------------------------
你在Ide中定义接口看看interface A {
// ide 报错:
// The return type is incompatible with Object.toString()
// 返回类型与Object.toString()不匹配
public int toString(); // 返回类型是int报错,需要String类型
}
//(a)接口A中的方法成员两部分:1)你自己定义的 2)类Object中的所有的public实例方法对应地迁移过去的(public abstract形式).
java语言规范中有说明。