站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题讨论:interface能继承concrete class么?请大家发表一下看法。

讨论:interface能继承concrete class么?请大家发表一下看法。

摘要: 讨论:interface能继承concrete class么?请大家发表一下看法。


在复习中遇到这么一个问题,在看Java经典试题及答案(CSDN上下载的,呵呵),看到如下一句话:
“抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。”随之想到interface可不可以extends concrete class呢?我想了一下,interface可以extends concrete class,但是不是什么concrete class都可以的。而abstract class extends concrete class和concrete class有没有明确的构造函数无关。请大家发表一下自己的看法,并给出说明:)


interface不可以extends concrete class,这个应该是java的最基本的思想,你想的太多了。
interface只能extends interface。


interface不可以extends concrete class,我觉得不是java的基本思想,如果是那sun当时做java的时候不是搬起石头砸自己的脚么?Object是concrete class,而且书上说Object是所有类的superclass,这就遇到另外一个问题,我翻了些资料,呵呵,可能没仔细看,没看到说interface到底是不是class,而且我也做了试验,interface确实跟Object有关系。interface和Object没发现他们间有聚合关系,那么我就猜想它们之间的关系是强关联关系咯,继承呗,呵呵。举个简单例子吧,如下
定义一个表示接口,如下:
package ...;

public interface MyInterface {

}
再定义一个concrete class实现这个接口
package ...;

public class MyClass implements MyInterface {

public static void main(String[] args) {
MyInterface mi = new MyClass();
mi.XXX();
}
}
大家可以用一些IDE试一试,mi的所有方法都是来自Object的(这里说的可能不是很规范,见谅),而mi的静态型别是一个标识接口MyInterface。到这里应该差不多会有想法了吧?



。。。。。。。。。。接分


synico(Keep it simple stupid) ,你的代码并不能表示你的interface继承了Object,而是你实现这个接口的那个类继承了Object。


是MyClass继承了Object类,而不是MyInterface继承了Object类


> MyInterface mi = new MyClass();
> mi.XXX();
> mi的所有方法都是来自Object的

之所以有几个 XXX() 可以用,那是*仅仅*因为“mi 肯定是一个 Object”,跟 MyInterface 没有任何关系,虽然你是通过 MyInterface mi 来访问它。


JF吧


不能


不好意思,可能我表达不是很清楚。我再解释一下。
我将mi声明为MyInterface,那么对于mi来说可以调用的方法只能是MyInterface里定义的方法,对么?我不是很肯定,我先问一下,还有,我把例子改了一下,如下
package ...;

public interface MyInterface {

}
再定义一个concrete class实现这个接口,并且继承了Employee 这个类
package ...;

public class MyClass extends Employee implements MyInterface {

public static void main(String[] args) {
MyInterface mi = new MyClass();
mi.XXX();
//如果调用Employee里面的方法,不能通过编译
}
}

Employee.java如下,简单的值对:
package com.xuewei.test;

public class Employee {

private String name;

private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

呵呵,我想这次清楚点了吧。关键是interface的用法和含意:)


rumlee(rum-lee)和 polarman(北极人)说的是一个道理,我也这样想过,但是MyInterface是一个空的标识接口,虽然mi继承了Object,但是按照语义,声明为MyInterface的对象mi,如果我调用例如mi.toString(),应该报The method toString() is undefined for the type MyInterface才对啊?
maquan('ma:kju) 说的我也想了下,既然我以MyInterface的方式来调用mi这个对象,就算mi这个对象具有Object的方法,但是如果MyInterface中如果没有定义该方法,而且MyInterface没有继承其他类的话,如何解释我能以MyInterface为对象型别调用mi的一些Object中的方法呢?


感觉接口没必要继承Object啊
当实现一个接口时你的实现类继承了Object
如果实现类继承了父类那它的父类也会继承Object的



public interface MyInterface extends Object{
}
报错
public class TestA extends Object{
}
没错误


piaopiao11() 呵呵,我也试过,但是你认为“Object是所有类的父类”这句话是对是错?


呵呵,有点不对啊,应该说"Object是所有类的祖先类”,基本上一切类都最终继承自Ojbect


> 我将mi声明为MyInterface,那么对于mi来说可以调用的方法只能是MyInterface里定义的方法,对么?

这个说法不对。事实上,通过 mi 可以调用 Object 中的方法。这是因为,在 Java 中,任何一个实例对象都*一定*源自 Object,所以 Object 中的方法*永远*是可用的,这应该理解成 Java 语言的语法特例。

前一段时间有个帖子讨论过这个问题。


maquan('ma:kju) 方便给个帖子地址么?谢谢了
> 我将mi声明为MyInterface,那么对于mi来说可以调用的方法只能是MyInterface里定义的方法,对么?
这句话我说的确实有点问题,不够严谨,没考虑到MyInterface的superclass


顶起


> 前一段时间有个帖子讨论过这个问题。

http://community.csdn.net/Expert/TopicView3.asp?id=4902867

> 这句话我说的确实有点问题,不够严谨,没考虑到MyInterface的superclass

haha, 这个“MyInterface的superclass”的说法还是有点欠妥……


> 我将mi声明为MyInterface,那么对于mi来说可以调用的方法只能是MyInterface里定义的方法,对么?

这个说法不对。事实上,通过 mi 可以调用 Object 中的方法。这是因为,在 Java 中,任何一个实例对象都*一定*源自 Object,所以 Object 中的方法*永远*是可用的,这应该理解成 Java 语言的语法特例。

前一段时间有个帖子讨论过这个问题。
------------------------------------------------------------------------------
mi能够调用MyInterface以外的方法,并不是由于别的,而是你的mi是MyClass的对象,也就是:
MyInterface mi = new MyClass();中的new MyClass()所赋予mi的具体对象类型。这就是运行期类型绑定。mi是MyInterface类型的变量,但是他存储的是一个MyClass类型的数据。所以mi可以调用MyClass的所有方法,MyClass的方法中当然包含了java.lang.Object中的方法。
另外,a interface type isn't a class type,这是非常明确的。java的数据类型中,明确规定引用类型有三种:class、interface、array(有的会把null类型单列出来)


谢谢yin_slin(一生找北) 了
能否把“a interface type isn't a class type”出处发一下么?
-----------------------------------------------------------------
mi能够调用MyInterface以外的方法,并不是由于别的,而是你的mi是MyClass的对象,也就是:
MyInterface mi = new MyClass();中的new MyClass()所赋予mi的具体对象类型。这就是运行期类型绑定。mi是MyInterface类型的变量,但是他存储的是一个MyClass类型的数据。所以mi可以调用MyClass的所有方法,MyClass的方法中当然包含了java.lang.Object中的方法。
-----------------------------------------------------------------
但是我觉得有个前提条件,如果mi要调用MyClass的所有方法,那就是我必须将mi向下转型,你说对么?

to maquan('ma:kju)
-----------------------------------------------------------------
haha, 这个“MyInterface的superclass”的说法还是有点欠妥……
-----------------------------------------------------------------
帮忙指正一下啊,哈哈,谢了



> 但是我觉得有个前提条件,如果mi要调用MyClass的所有方法,
> 那就是我必须将mi向下转型,你说对么?

没错,严格说,调用 mi.toString() 应该写成 ((Object)mi).toString(),而且,这里的强制转换永远是能够成功的。之所以可以简写成 mi.toString(),我个人认为是 Java 语言的特例(也正因为“这里的强制转换永远是能够成功的”,才可以上升到语法层面)。

> haha, 这个“MyInterface的superclass”的说法还是有点欠妥……
> 帮忙指正一下啊,哈哈,谢了

hehe, 没什么,我的意思只是:MyInterface 既然是一个 interface,它是不会有 superclass 的,只会有 superinterface :)


↑返回目录
前一篇: 序列化的问题
后一篇: properties 问题