将对象强制转换为java中的接口?

Pau*_*aul 13 java interface

如果我们将一个对象转换为一个接口,这个对象是否能够调用自己的方法?在下面的例子中,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)

对于这是合法的,都ObjSec将要成为执行者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.在外部,通过接口引用使用这些实例的人员只能访问接口方法.