2011-09-26 69 views
2
interface Device 
{ 
    public void doIt(); 
} 

public class Electronic implements Device 
{ 
    public void doIt() 
    { 
    } 
} 

abstract class Phone1 extends Electronic 
{ 
} 
abstract class Phone2 extends Electronic 
{ 
    public void doIt(int x) 
    { 
    } 
} 

class Phone3 extends Electronic implements Device 
{ 
    public void doStuff() 
    { 
    } 
} 

任何人都可以告诉我为什么编译..因为“Phone3”实现设备,它应该有doIt()方法,但它没有。但是这仍然编译。我可以知道Y吗?在Java界面实现的疑问

+9

14个问题,没有被接受的答案? :( –

回答

2

implements Device在类别Phone3定义中是多余的。该类继承Electronic类实现Device接口的事实。

也就是说,每个延伸的类Electronic也在执行Device,并且也在继承Electronic提供的doIt的实现。它们中的每一个都可以通过覆盖它来扩展/提供不同的实现doIt

6

Phone3延伸ElectronicElectronic具有方法doIt(),实现Device接口。因此doIt方法的实现只是从Electronic基类继承而来。

如果你让这个例子更真实一些,这是有道理的。使用ring方法将Device更改为Ringable。创建一个实现Ringable的基类SimplePhone,并执行ring方法。并将SimplePhone的子类称为BeautifulPinkPhone。美丽的粉红色手机将能够响铃,因为它只是一个粉红色的简单电话。

1

这是因为Phone3扩展电子电器已经实现了doIt()方法。

1

它有效,因为Electronic实施Device。你有没有尝试在主类中的接口实现编译?

+0

不..但是我明白了它编译得非常感谢 –

0

Phone3延伸Electronic,其已经实现了doIt

1

Phone3Electronic类继承它。

0

原因Phone3还扩展了电子产品,该产品具有doIt方法的空白实现。
所以它不需要拥有它,除非它需要重写行为。

1

Phone3扩展了Electronic并继承了它的所有方法。由于Electronic有一个doIt()方法可以编译。

1

Phone3扩展Electronic因此它继承doIt()方法

1

如果您在上面的代码中看到,电话3已经实施doIt方法()在继承树方法 ,即在电子类,如果你想 在你的Phone3类中调用doIt()方法会很好地工作,例如。

class Phone3 extends Electronic implements Device 
{ 
public void doStuff() 
{ 

} 
public static void main(String...args) 
{ 
    Phone3 p3=new Phone3(); 
    p3.doIt(); 
} 
} 
+0

@sai sindhu,如​​果从你的Electronic类中删除implements Device,那么它也可以工作,因为Device接口内部存在的方法与你在Electronic clas中定义的方法相同 – subodh