日期:2014-05-17  浏览次数:20775 次

[初学Java]百思不得其解,我看到一个Interface被实例化了,没出错正常运行
我初学java,初到不能再初的那种。
新加入公司,在java组,项目经理给我发来一份公司以前做的项目,用的公司自己的框架,让我看懂。但是有一处我真是百思不得其解啊。

在LoginBean类的login方法中有句“UserInfo userInfo = userService.getUserInfo(userId)”
在UserService类的getUserInfo方法中有“UserInfo userInfo = userInfoDao.getUserInfo(userId);”
而打开UserInfoDao.java看到的是“public interface UserInfoDao”

不是说接口是不能被实例化,只能被继承的么?接口里的方法都是虚方法“public abstract UserInfo getUserInfo(String s);”,没有具体的实现的。可是它居然确确实实的被实例化了,还调用了它的方法,并且更诡异的是,它真的能运行…怎么会呢?这个方法压根就是个尚未实现的虚方法,怎么运行。

=========================
另外顺便问一下,我很好奇,公司这个框架的src目录下的每个最里层的的子文件夹下都有“.svn、apply、dialog、manager、pos、sequence、workflow”这样的目录结构,不知是java语言的格式要求还是某个框架(struts/spring/ibatis)的格式要求或者是公司自己的要求?
附:刚注意到webContent下也有这样的目录结构……神马状况

------解决方案--------------------
有个东西叫 多态
------解决方案--------------------
引用:
我初学java,初到不能再初的那种。
新加入公司,在java组,项目经理给我发来一份公司以前做的项目,用的公司自己的框架,让我看懂。但是有一处我真是百思不得其解啊。

在LoginBean类的login方法中有句“UserInfo userInfo = userService.getUserInfo(userId)”
在UserService类的getUserIn……

楼主第一个问题,是面向接口编程,【userInfoDao.getUserInfo(userId)】中,userInfoDao是UserInfoDao类型,而实际上传入的肯定是UserInfoDao的实现类,因为接口不能实例化。
这样定义成UserInfoDao,比较灵活,相当于所有UserInfoDao的实现类都可以传进来使用。
我给你举个JDK的例子:


    public static void print(List<String> list) {
        if (!list.isEmpty())      // 此处的list也只是定义成接口类型,但是实际上调用的是具体的实现类
            System.out.println(list.get(0));
    }
    public static void main(String[] args) {
        
        List<String> list = new ArrayList<String>();
        list.add("HelloWhold");
        print(list);
    }


至于楼主的第二个问题,公司代码的分层是自定义的,根据不同的业务需要可以定义成不同样子,用起来方便就行。
不过一般会有几层比较类似的:
DAO层:数据库操作
Modal层:javaBean