java语法与框架相遇

来源:互联网 发布:ubuntu双系统磁盘分区 编辑:程序博客网 时间:2024/05/17 11:59

       打算写这篇文章,是因为我找到了一直困扰我的一个问题的答案,随即联想到以前的一些相关事物。

       这个问题其实很简单:“为什么调用接口方法就会执行相关实现类的方法呢?”,我是个追求答案的人,当你一直去写项目觉得这种写法无可厚非的时候,可真正深思起来又不知原理几何。于是当我进入一家新的公司,翻阅公司平台框架的时候,出现了大量的抽象、接口、子类对象指向接口引用。看这样的代码会让人觉得很兴奋,打了鸡血一样!可有些地方一直理解的不够透彻。而这些地方的关键点在之后整理的过程中竟然就集中在了这个问题上!

      讲一些面试官对应届生或者实习生老生常谈的问题,常会考你一些java语法知识。比如:“讲一下list有哪几个实现类,各自的优缺点在哪里?”,“讲一下你对多态的理解。”仔细想一下,这两个问题对知识点的考察都很全面,前者涉及到集合的多种存储结构,单例、多例、线程安全性、适用场合、遍历方式。后者则是对java特性的一个深入理解。

      java数据类型分两类:基本类型(内置类型)和引用类型,引用类型常见的有string、类类型和集合类型。jvm内存分四大块:堆区,栈区、静态区、代码区。一般基本类型的赋值过程都是在栈中完成的。那引用类型呢,看看上面几个引用类型的共同特点,它们都是类,都是带有一部分或者全部现实意义的能够被实例化的类。即能够"new"出来,而实例化对象是在堆上操作的。举个例子:

    Singleton instance = new Singleton();

         new 操作会开辟一个堆空间,并初始化该对象,所以用==(比较的是栈地址)比较两个new对象时,是不会相等的。但另一方面,new对象并赋值整个过程是无序的,在多线程并发的情况下你在可能会在一个线程中得到一个还没来得及初始化的对象被指向其引用,然后另一线程在调用它的时候以为它实例化完成从而导致出错。所以个人觉得在单例模式里懒汉模式中加同步块或者双重检查机制都不可取,可以根据个人情况使用内部类加载机制去实例化那个唯一私有构造器。理由是类在加载过程是线性互斥的。

       多态的三个关键是:重写、继承、动态连接。动态引用即可指Animal a = new Cat(); 子类对象指向父类引用,好处是可抽取父类共性又可使用子类强大功能。至于原理,回想下子父类的加载过程,它会先加载父类再加载子类,这很像给子类套了一层外皮,然后这层外皮指向了那个引用。那么List<?> list = new arraylist<?>就很好理解了子类对象指向接口引用,因为接口也是父类啊。

   现在回过头来思考这个问题,”为什么调用接口方法就会执行相关实现类的方法呢?“,其实这是有前提的,spring框架。个人觉得spring框架是工厂类历史演变过来的,无论是SSH还是SSM,都有spring的影子,spring关键的的几个特点之一就有“bean的自动注入”而bean的自动注入其实就是一个实例化类的过程。所以在框架中我们会看到spring的配置当中会扫描**包。我们的serviceImp会加上注解@service将其交由spring管理,spring为其创建唯一实例。所以在这里,加载这个类包括它的父类(谁?当然是接口)。于是当你在controller调用接口的方法是它就自然走到了你的serviceimp里面去了!

   讲到这里,这个问题也就找到答案了。对了,还有抽象,当这些东西结合在一起的时候,代码看起来真的很cool!


   转载请标注原文链接:http://blog.csdn.net/qq_28516695/article/details/78526660

原创粉丝点击