昨天参与的公司另一部门的新项目,在看系统架构的时候产生了一个对继承的问题。求解。该架构中,常用的CommonDaoImp类注入到业务business类,而模块化的xxxDaoImp类不继承该CommonDao,同样注入到business类。 而以往的习惯都是xxxDao extends CommonDao 从而引发了一段和部门技术人员的对话。该系统的架构人员称CommonDao属于纯方法体,如果使用继承,在子类加载的时候会把父类的所有属性及方法加载到子类中而造成子类的臃肿。差不多是这种表达。而我的回应是,我认为做继承仅仅只是一种引用。(说的不是很专业化,见谅)加载的时候仅加载一次父类的方法,当子类中调用父类的成员及函数的时候,直接调用父类的方法。不是到这么描述各位是否清楚。 总的而言我认为,在系统中继承的情况下,父类仅仅加载一次,而对方的观点是,子类加载的时候,会将父类的成员及函数同时加载到子类中而造成系统中某方面的臃肿。有没研究过这方面JVM的牛人,给点指点。上100分。
不过我觉得extends CommonDao 做法没什么不好的 抽取公用方法 这样也可以提高开发效率
不过CommonDao 这个类的方法 还是大家评审下 也不能什么都往里写
LZ可以看看这本书。
所以子类的实例化必然会引发父类的初始化。会造成所谓的“臃肿”。而接口则很大程度不会造成这个现象。
我能接收这种设计 只是这次对话中引发了我对继承的想法 在思索同一个父类在系统中过多的继承是否会对系统增加不必要的压力。 现在系统中大都交给了spring做单例控制,父类及子类都在系统启动的时候单例模式初始化了。 让我纠结的是,子类在初始化的时候,或者这么说吧。譬如10个子类继承同一个父类 11个类都在spring的factory管理中。在系统启动的时候,11个子类都将初始化
(我个人比较喜欢静态化的单例模式,避免多线程的情况下出的问题,以及锁、多重锁的资源消耗。)
那么是否11个子类在初始化的同时会将父类的所有内容加载到子类的实例中去,还是说仅仅也只是一个引用。在调用父类方法的时候直接的引用到父类的实例中去调用。建议LZ可以研究一下《深入java虚拟机》这本书。子类的实利化对父类的影响不是一个非常简单的过程。
LZ可以看看这本书。谢谢4楼推荐,一定会看。8楼兄弟,谢谢回答。一会去找找这6种情况的区别。之前没有研究过jvm层。看来本人有必要往深点钻一钻了。
private String str1 = "123";
get...();
set...();
public String str2 = "abc";
get...();
set...();
单例
private static F类 f = new F类();
public static F类 getInstact() {
return f;
}
10个子类继承这个
private static C类1 c1 = new C类1();
.
.
.
private static C类1 c10 = new C类10();
public static C类10 getInstact() {
return c10;
}
问题:在系统启动后,内存中有几个 "123"和几个"abc"
如果是普通的继承,子类加载的时候父类肯定会初始化,而且是每次子类初始化父类都会初始化的,你们公司那个架构师说的并不无道理,肯定会造成臃肿;
如果是spring把父类注入到子类中,spring有对象池,每次都从对象池里去取,因此父类只会加载一次