我对接口有疑问 我看过一些代码,他们正在编写
Connection con = Drivermanager.getConnection("URL","User name","Pwd");
这里con(连接接口的参考变量)持有Oracle Connection Object。 因为我们知道我们正在创建Oracle连接对象,为什么我们不能写
OracleConnectionClass Oraclecon = Drivermanager.getConnection("URL","User name","Pwd");
如果我问一些人他们说,他们通过使用连接接口实现多态性。
但是,
有什么用。
我们可以做到
通过两个引用(con和Oraclecon)创建语句,执行查询等。
simillarly for List和ArrayList
提前致谢
答案 0 :(得分:7)
您知道您现在正在创建的确切类型,但由于您自己的代码更改或实施更改,这可能会在未来发生变化。
多态性用于抽象细节,因此您不必在以后触摸代码。如果您在此处使用了确切类型而不是界面,并且该类型已更改,则您必须更改代码。
这种后果似乎很明显。改变代码是工作,工作需要花钱,因此更少的改变意味着更低的成本。
但它更贵。每次更改稳定代码时都有可能引入错误。这个风险很低,但也值得一提。
这就是他们使用界面的原因。
这是多态性的一个很好的例子。
Queue<Float> queue = new LinkedList<Float>();
我们可以简单地改变行为。
Queue<Float> queue2 = new BlockingQueue<Float>();
或者这个怎么样?
Queue<Float> queue3 = new PriorityBlockingQueue<Float>();
我们可以使用所有队列来快速改变行为。
答案 1 :(得分:3)
简短的回答是“因为我们不关心它是OracleConnection”。它可以更改为MySQLConnection,代码仍然有效,因为它们都会实现Connection类。
另一个例子是List接口。
List<String> l = new ArrayList<String>();
如果您需要更改列表类型,则只需更改一个位置。
List<String> l = new LinkedList<String>();
答案 2 :(得分:3)
在一个紧密耦合编写的代码中,除了像我使用多态之类的奇特名称之外什么都没有。
但是想象一下当你有一个实例变量为
的情况Connection con;
和接受连接的参数化构造函数
public businessDao(Connection con){
this.con = con;
}
//使用连接的某些功能
现在构造函数可以接受实现Connection接口的任何类型的连接对象
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()
或jndi连接如下
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/jelasticDb");
con = dataSource.getConnection();
您不需要使用连接类型对代码进行硬编码,只需传递所需类型的对象即可。
您可以在Dependency Injection中找到多态的实际用法。