怎么调用接口中的方法
1、首先启动电脑上的Eclipse,依次选择File→New→Project。在弹出的Select a wizard窗口中,选择Java Project 后点击下一步。
2、输入项目名称后点击下一步(名称命名可以任意,但是要注意符合命名规范)、
3、鼠标右击新建的项目,依次选择New→Package,在package name里面输入自己想取的名字后点击next
4、鼠标右击包,依次选择New→ Interface,创建一个接口
5、将接口命名为ShoutAbility后,点击完成。
6、定义接口shout()方法,并按下Ctrl +S 保存,经常保存是一个良好的习惯。
7、右击包,依次选择New→Class,并将类命名为AoShout。
8、将AoShout 实现ShoutAbility接口,并且要实现接口里面的shout方法,实现接口的关键字为 implements。按下Ctrl+S 保存。
9、创建一个Bird类,并定义一个带参构造方法,实例化上面定义的接口。定义Bird 的 shout() 方法时,即可用接口变量调用接口方法。按下Ctrl +S 保存。
10、创建一个测试类,用接口的实现类AoShout创建一个接口对象,再用创建的bridShout对象创建一个鸟对象。这时候调用鸟类的方法,就会执行调用到接口的方法,通过接口找到实现类的方法嗷嗷叫。
接口的继承与调用
隐式实现接口方法:
例子:
定义个类Base,该类实现了IDisposable
// This class is derived from Object and it implements IDisposable
internal class Base : IDisposable
{
// This method is implicitly sealed and cannot be overridden
public void Dispose()
{
Console.WriteLine("Base's Dispose");
}
}
// This class is derived from Base and it re-implements IDisposable
internal class Derived : Base, IDisposable
{
// This method cannot override Base's Dispose. 'new' is used to indicate
// that this method re-implements IDisposable's Dispose method
new public void Dispose()
{
Console.WriteLine("Derived's Dispose");
// NOTE: The next line shows how to call a base class's implementation (if desired)
// base.Dispose();
}
}
结果调用显示:
public static void Main()
{
/************************* First Example *************************/
Base b = new Base();
// 用b的类型来调用Dispose:结果Base's Dispose
b.Dispose();
// 用b所指向的对象的类型来调用Dispose,
// 因为b的对象的类型IDisposable的Dispose方法是b的对象实现的
//所以结果是;Base's Dispose,和上面一样的
((IDisposable)b).Dispose();
/************************* Second Example ************************/
Derived d = new Derived();
// 用d的类型来调用Dispose,结果;Derived's Dispose
d.Dispose();
//用d所指向对象的类型来调用Dispose,结果:"Derived's Dispose"
((IDisposable)d).Dispose();
/************************* Third Example *************************/
b = new Derived();
// 用b的类型来调用Dispose,b的类型是Base。结果是:Base's Dispose
b.Dispose();
// 用b所指对象的类型调用Dispose,b所指的对象是Derived,所以结果是:Derived's Dispose
((IDisposable)b).Dispose();
}
上面接口的方法调用中,要注意两个概念:当调用一个接口方法时,到底是对象所指的类型在调用,还是类型在调用。
上述的Base类和Derived 类中的Dispose方法都隐式的实现了接口IDisposable中的Dispose方法。若对于接口IDisposable中的Dispose方法做显示实现,则可以更加清楚的看到这一点。
现在对代码做显示的实现。
显示接口方法实现
internal class Base : IDisposable
{
// This method is implicitly sealed and cannot be overridden
public void Dispose()
{
Console.WriteLine("Base's Dispose");
}
/// <summary>
/// Base显示实现IDisposable
/// </summary>
void IDisposable.Dispose()
{
Console.WriteLine("Base->IDisposable.Dispose");
}
}
internal class Derived : Base, IDisposable
{
// This method cannot override Base's Dispose. 'new' is used to indicate
// that this method re-implements IDisposable's Dispose method
new public void Dispose()
{
Console.WriteLine("Derived's Dispose");
// NOTE: The next line shows how to call a base class's implementation (if desired)
// base.Dispose();
}
/// <summary>
/// 显示实现Dispose方法
/// </summary>
void IDisposable.Dispose()
{
Console.WriteLine("Derived—IDisposable.Dispose");
}
}
同样的调用代码如下,则结果为:
public static void Main()
{
/************************* First Example *************************/
Base b = new Base();
// 用b的类型来调用Dispose,b的类型是Base,结果将调用类型的公共方法public void Dispose():结果Base's Dispose
b.Dispose();
// 用b所指的对象的类型来调用Dispose,
// 因为b的对象的类型IDisposable的Dispose方法是b的对象显示实现的,它与Base类中的公共方法
//public void Dispose()无关,它将调用接口类型IDisposable的void IDisposable.Dispose()方法
//所以结果是;Base->IDisposable.Dispose,和上面是不一样的。
((IDisposable)b).Dispose();
/************************* Second Example ************************/
Derived d = new Derived();
// 用d的类型来调用Dispose,d的类型是Derived,它将调用方法public void Dispose() 。结果是Derived's Dispose
d.Dispose();
//用d所指对象的类型来调用Dispose,d对象类型被显示转换成了IDisposable,因此它将调用
//void IDisposable.Dispose()方法,因此结果是“Derived—IDisposable.Dispose”
((IDisposable)d).Dispose();
/************************* Third Example *************************/
b = new Derived();
// 用b的类型来调用Dispose,b的类型是Base。结果是:Base's Dispose
b.Dispose();
// 用b所指的对象的类型调用Dispose,b所指的对象是Derived,Derived类型的对象被强制转换成接口类型IDisposable。
//它调用的是void IDisposable.Dispose()。所以结果是:"Derived—IDisposable.Dispose"
((IDisposable)b).Dispose();
}
比如
interface A {
void interfaceMethod();
}
class B {
public void classMethod(A a) {
a.interfaceMethod();//直接这样调用没有任何问题的 因为他A是接口不能实例化 他传给你的a对象一定是实现了A接口的 调用的也就是实现的那个方法
}
}
接口的用法一般都离不开反射的