如果我们将一个对象强制转换为接口,该对象将无法调用其自己的方法吗?在下面的示例中,myObj将只能调用MyInterface方法吗?
myObj
MyInterface myObj = new Obj();
如果正确,那么这两个对象之间有什么区别:
MyInterface myObj = new Obj(); MyInterface mySec = new Sec();
谢谢你的帮助
对于这是合法的,都Obj和Sec将要成为执行者MyInterface。这两个对象之间的区别在于它们 如何 提供该实现。Obj并且Sec可以做两个非常不同或非常相似的事情,但是它们的共同点是它们会遵守您可以依赖的合同。考虑你有办法
Obj
Sec
MyInterface
public void doSomethingWith(MyInterface thing) { thing.frob(); }
可以将每个对象myObj和mySec传递到此方法中,然后该方法可以使用该对象的frob方法(假设frob是接口声明的一部分)。这是 解放 。通过对接口而不是对实现进行编程,这使您可以做非常强大的事情。例如,您可以扩展类的功能,而无需更改这些类中的代码行,您只需传递依赖项的不同实现即可。你是不依赖于,或 再加上 ,该方法内的任何一个implentation doSomethingWith。
mySec
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 } }
的实例Obj仍将是的实例Obj,并且这些实例仍将能够使用doFrobbing。在外部,通过接口引用 使用 这些实例的人员将只能访问接口方法。
doFrobbing