2014-12-04 74 views
2

我今天遇到过一些新东西,似乎无法将其包裹在头上。请记住,以下问题适用于Java - 主要是Java JDBC。Java对象=方法?包括的例子

我有以下代码:

Connection con = DriverManager.getConnection(Url, "username", "password"); 

这:

Statement myStmt = con.createStatement(); 
ResultSet myRs = myStmt.executeQuery("select * from employees"); 

什么是真正回事?我收集该方法返回一个对象,如新的连接对象?

另外,是不是连接一个接口?那么它会如何创建一个新对象?

+0

“我收集该方法返回一个对象,如新的连接对象?” - 您使用三种不同的方法调用发布代码;你在说第一个吗?那么你的问题中另外两个的相关性是什么? – davmac 2014-12-04 21:11:23

+0

另外:“另外,Connection是不是一个接口?那么它将如何创建一个新对象?” - 连接是一个接口,但连接不创建任何对象。该对象来自'DriverManager.getConnection(...)'方法(在DriverManager类中)。 – davmac 2014-12-04 21:13:02

+0

对不起,我应该澄清这些。我想知道所有3个,因为他们似乎正在使用不同的类来分配对象? – Snessy 2014-12-04 21:13:23

回答

0

Java方法有“返回类型”,因此您可以调用返回对象的方法。在这里这两种情况下,

Statement myStmt = con.createStatement(); 
    ResultSet myRs = myStmt.executeQuery("select * from employees"); 

的方法返回的对象,一个是声明,另一个是从执行语句(结果集)

希望帮助,我assumin你所得到的数据'对于OOP来说是新的,这是你将要使用和实现的一种常见模式。

+0

方法是无效的不返回对象FYI ... – markg 2014-12-04 21:12:39

0

Connection con = DriverManager.getConnection(Url, "username", "password");

1)是,在类 “的DriverManager” 具有返回 “连接” 对象的静态方法。

2)是的,“连接”是一个接口。 getConnection()返回的对象是实现该接口的类的一个实例。

这里是DriverManager的,连接和驱动程序,分别为文件:

http://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager.html

http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html

http://docs.oracle.com/javase/7/docs/api/java/sql/Driver.html

要注意的关键问题是,要动态加载运行时正确的驱动程序您可能有一个Oracle驱动程序,或一个MSSQL驱动程序或一个mySQL驱动程序。这对几乎所有的JDBC代码都是透明的 - 除了加载驱动程序的部分,以及2)设置特定的连接字符串。

'希望有帮助!

+0

“类”驱动程序有一个静态方法“ - 该类被命名为'DriverManager'而不是'驱动程序'。 – davmac 2014-12-04 21:13:54

1

In interface描述哪些方法的签名可用于特定的对象。你在这行做什么

Connection con = DriverManager.getConnection(Url, "username", "password"); 

是您在使用getConnection工厂方法的参考con,可以认为,与Connection接口符合实例分配创建的实例。

您不能直接实例化接口 - 因为接口不指定实现。但是,您可以将引用指向实现该接口的对象,因为您可以引用其他对象。如果您严格遵守接口中定义的方法,只要在编译时或运行时实现接口,就可以将一个对象与另一个对象交换。

诸如getConnection()之类的工厂方法是用于实例化对象的静态方法。对象也可以使用构造函数创建,但工厂方法更加灵活,甚至可以在任何类中定义(例如示例中的DriverManager)。

0

这里是你得到的对象,当谈到连接它是一个接口,你可以通过调用DriverManager.getConnection(Url,“username”,“password”)来获得Connection接口中方法的实现。

基本上这是接口的另一种用法,实现是隐藏的,你只需知道在这个接口中有一个通过这个名字的方法,你可以使用它。

1

的代码:

Connection con = DriverManager.getConnection(Url, "username", "password"); 

这是一个Factory Pattern。经理基于通过的URL创建适当的具体Connection类。

Connection本身是所有具体连接类实现的接口(javadoc)。 MySQL,Postgres,Oracle,无论如何...他们都是连接类。 DriverManager选择其中的一个并创建它。

DriverManager如何知道?驱动程序类别register themselves与驱动程序一起由类加载程序加载时。当驱动程序询问“谁响应此URL”时,它会在每个驱动程序中调用acceptsURL方法,并且响应的方法在使用connect调用时返回连接。

Driver(知道如何与驱动程序一起工作的)中得到Connection对象后,就可以创建一个语句或对该数据库执行一个查询以返回结果集。

这些的具体情况取决于驱动程序实施。你刚刚得到了这样的接口,它的工作原理。从您的角度来看,所有的ResultSet,Statements和Connections(以及Drivers)的工作方式都是一样的,但它们如何连接到幕后的光标和数据库可能会有所不同。但那并不重要。你有一个界面,他们都以同样的方式工作。

这些都是Factory Patterns的实例。 Factory, Abstract Factory and Factory Method可能是一个有用的解读此事。其他模式描述为Examples of GoF Design Patterns in Java's core libraries。你也可以找到This lecture on Factory Pattern有用(它有一个经典的“比萨饼”例子)。

由于这些都是模式(我故意用大写字母“P”来写),您会发现这些解决方案在整个程序中一次又一次地以相似的方式使用。一旦你意识到你正在与工厂打交道,你很可能会更有效地使用它。