为什么JAVA中一些类用另的一个类的对象来调用?

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegxDemo03 {
public static void main(String[] args) {
String str = "a-753933" ;
String pat ="[abc]-\d{6}";
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(str); //验证字符串是否合法
if(m.matches()){
System.out.println("格式合格");
}else{
System.out.println("格式不合格");
}

}
}
感觉有点奇怪,这是一种什么逻辑?直接用一个类来实现不就可以了。具体的像
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(str); //验证字符串是否合法
还有其他一些类,像操作数据库的类也是这样的。

还比如向MySQL的JDBC链接也是这样.比如:
Connection con =DriverManager.getConnection(url,username,password);
Statement stmt = con.createStatement();
ResultSet rt = stmt.executeQuery();
我不明白的是为什么需要通过先获得con对象才能通过con对象获得stmt后才能获得rt对象.不明白这种对象的调用原理..新手.才接触java没多久,,希望各位大神能帮忙解惑.说细致点..谢谢..最好能举例说明..
-----------------问答分割线------------------

昨天提问后.自己从面向对象上找资料复习..然后看到了单例设计模式.因为之前老师在说单例设计模式时一笔带过了..所以印象不深刻..这里给自己的提问做个半总结.因为资料还在看....自我解决问题嘛..

设计模式:对问题行之有效的解决方式.其实它是一种思想.
1.单例设计模式.
解决的问题:就是可以保证一个类在内存中的对象唯一性.
必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性.
如何保证对象唯一性呢?
1.不允许其他程序用new创建该类对象.
2.在该类创建一个本类实例.
3.对外提供一个方法让其他程序可以获取该对象.

步骤:
1.私有化该类构造函数.
2.通过new在本类中创建一个本类对象
3.定义一个公有的方法,将创建的对象返回.
举个简单的例子:
class Single
{
static Single s = new Single( );
private Single( ){}
public static Single getInstance( )
{
return s;
}
}

class SingleDemo
{
public static void main(String[] args)
{
single ss = single.getInstance( );
}
}
私有化构造器,通过类名.方法名调用本类的方法返回s.来得到本类中new出来的对象.这就是昨天所提问的一部分解答..还有一部分问题找答案..为什么需要得到一层再调用一层..我也知道这是一种设计模式..只是想更深入的了解它的设计原理.以及优点..
谢谢各位耐心的解答..等我完全解决了问题..我再结帖.语言组织能力不是太好,希望这些问题能让与我有同样疑惑的伙伴做个最基础的解惑..非常感谢大家的热心回答及帮助..

这里和“向上转型”毫无关系,而是一个方法的返回值是一个对象,这被称作“工厂模式”

比如你的例子里,Pattern并不直接使用new初始化,而是通过Compile来构造并且返回。这里静态的Pattern.Compile就是一个工厂方法。

使用工厂方法的动机主要是,构造方法的过程本身很复杂(比如Compile,构造一个正规自动机是复杂的,再比如Java里的反射方式创建对象,再比如根据查询字符串构造Parameter对象),或者需要满足特定的逻辑(比如“单例模式”),或者出于性能的需要(比如缓存和懒惰加载)等等。

Java众所周知是一种面向对象的语言,将方法封装在对象类中,其他对象的调用就可以只关心接口而不需要关心具体实现。举个例子,当方法改变后,调用该方法的代码片段无需改变就可以继续运行

正则表达式的处理是组件的方式实现,用的是一组对象和方法,但是有很好的封装效果,你不需要知道内部的细节。JDBC有点差别,jdbc是第三方接口的形式提供的,
要想使用它要有第三方的接口实现,所以每次用jdbc都要有数据库驱动的信息。jdbc是设计模式当中依赖抽象不依赖具体实现细节的表现

你要先了解一下 封装继承多态和抽象 这是最基本的面向对象编程思想 不是几句话说的完的 面向对象说简单也简单 说难也难 每个不同层次的程序员都有不同的认识

另一个类中可能封装了对这个类创建对象的方法

一方面都写在一个类里代码太多,不容易维护,另一方面,这些连接数据库什么的都是公共的,每次调用都写就会有大量重复代码,把公共的封装起来,每次用到都可以直接调用

类加载是有顺序的,有些类实需要别的类加载完了,它自己加载时才能获得加载时的条件,比如数据库的操作,它是有一个流程的,加载驱动--》通过驱动获得数据库链接--》
通过链接向数据库发送指令--》让后获得请求数据返回的响应--》关闭链接、指令和流资源、处理结果集等,都是有先后顺序的,直接用一个类无法完成,因为它比如你的结果集类加载时它必须要
链接好了才能满足条件。

面向对象一个很重要的特点是,一个类只做一件事

工厂模式单例模式很多都是你说的那样写法。有时候需要限制你去创建某个类的对象,就会隐藏该类的构造函数,只给你提供一个获取对象的方法。至于对象如何创建如何维护,都不需要你来关心。
api里这样的写法比比皆是,等你基础语法差不多了,就模仿着23中设计模式中比较重要常见的几种模式敲敲代码,既能提升熟练度,还能帮助理解设计模式

Question:
感觉有点奇怪,这是一种什么逻辑?直接用一个类来实现不就可以了
Answer:
直接用一个类实现是可以的,这就只是针对于自己来解决问题,是一种面向过程的思想,
若以后需要匹配后返回匹配串,那又得重新写一个类,这样完全失去了java的面向对象思想。
只是个人愚见,错误之处还请提出哦~

简单的说,这属于面向对象变成的范畴了。一般的新手程序员会直接在自己要用的方法中直接的写实现的代码,即使是同样作用的代码也会写很多次,造成代码的重复使用性和可维护性降到最低。以为后面如果有一个地方出现错误,要修改的地方就很多了。而楼主说的这种方法属于封装,就是把一些常用的方法封装起来,让其他通用使用该功能的地方一起调用。
这样解决了多个问题:1.数据逻辑的安全性,除非去看这个方法,不然不知道实现原理,用在一些安全要求比较高 或者需要封装的地方。2.可重用性,可以多个地方调用同一个方法,不用每个地方都累赘的去写同样的代码。3.可维护性,只要修改一个地方,就可以解决所有调用上遇到的问题。这样写有助于写出高质量的代码。
只有会使用封装和面向对象开发的程序员,才算是入门了。