如果我们将一个对象转换为一个接口,这个对象是否能够调用自己的方法?在下面的例子中,myObj只能调用MyInterface方法?
MyInterface myObj = new Obj();
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,那两个对象之间有什么区别:
MyInterface myObj = new Obj();
MyInterface mySec = new Sec();
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
Ant*_*ram 19
MyInterface myObj = new Obj();
MyInterface mySec = new Sec();
Run Code Online (Sandbox Code Playgroud)
对于这是合法的,都Obj和Sec将要成为执行者MyInterface.这两个对象之间的区别在于它们如何提供该实现.Obj并且Sec可以做两件非常不同或非常相似的事情,但他们的共同点是他们会遵守你可以依赖的合同.考虑一下你有一个方法
public void doSomethingWith(MyInterface thing) {
thing.frob();
}
Run Code Online (Sandbox Code Playgroud)
每个对象,myObj并且mySec,可被传递到该方法中,然后该方法可以使用该对象的frob方法(假设FROB是接口声明的一部分).这是解放.这允许您通过编程接口而不是实现来执行非常强大的操作.例如,您可以扩展类的功能而不更改这些类中的一行代码,您只需传递一个不同的依赖实现.您不与方法中的任何一个实现绑定或耦合doSomethingWith.
但我也读到如果我们将对象myObj声明为MyInterface,myObj将无法使用自己的方法(来自Obj类),这是正确的
在内部,实例Obj将继续拥有对ObjAPI的完全访问权限.myObj仍然是一个Obj,它将始终能够使用自己的实现细节.
public interface MyInterface {
void frob();
}
public class Obj implements MyInterface {
public void frob() {
doFrobbing();
}
private void doFrobbing() {
System.out.println("frobbing");
}
public static void main(String[] args) {
MyInterface myObj = new Obj();
myObj.frob(); // still internally calls doFrobbing()
((Obj)myObj).doFrobbing(); // visible only via class reference
}
}
Run Code Online (Sandbox Code Playgroud)
实例Obj仍将是实例Obj,并且这些实例仍然可以使用doFrobbing.在外部,通过接口引用使用这些实例的人员只能访问接口方法.