java中没有抽象方法的抽象类有什么意义?仅仅是为了让别人不能创建该类的对象?
问题描述
问题解答
回答1:最常用到的地方就是实现模板方法(Template Method)?举个例子,你要写一批远程服务的本地代理。对于这批代理来说,获取请求地址、发送请求、获取相应内容的步骤都是公共的。只有定义字符编码类型、定义响应回调两个步骤是差异的。
这时候就可以定义一个抽象类,把请求过程都写完。而将差异的部分留给实际的子类去定义。不是设计者【不让】抽象类实例化,而是在知道远程服务的特性前无法确定一些属性,从而不可能实例化。
JDK中的例子就是 java.io.InputStream。它的 read(byte[], int, int) 方法调用了 java.io.InputStream.read() 方法。而read()是一个抽象方法,需要在子类中定义。你可以看源码学习一下。
public abstract int read() throws IOException; public int read(byte b[], int off, int len) throws IOException { if (b == null) {throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) {throw new IndexOutOfBoundsException(); } else if (len == 0) {return 0; } int c = read(); if (c == -1) {return -1; } b[off] = (byte)c; int i = 1; try {for (; i < len ; i++) { c = read(); if (c == -1) {break; } b[off + i] = (byte)c;} } catch (IOException ee) { } return i;}回答2:
你得看看它是否继承了什么类或者实现了什么接口
很有可能放置了一些共用方法
如果没有,不如改成接口
回答3:可能提取了一些公共方法和实例字段。
回答4:应该不是说没有抽象方法的抽象类有特殊的意义,只是抽象类的普通意义,给出默认实现,比直接实现接口可能会少些部分代码。反过来说,硬是要求一个抽象类保留一个两个抽象方法有什么意义?
回答5:说反了,是为了让这个类的子类必须创建这个某些方法。当然这也是接口的要求,但是接口要求所有方法都是抽象方法。但是抽象类可以预先定义一些不需要子类必须重载的方法。
抽象类和接口都是为了抽象,抽象的好处就不说了。比如我们要实现一个Equal接口或是类,定义两个方法 equal 和 unequal。如果用接口实现,一个类必须实现这两个方法。可是如果用抽象类实现,可以把unequal在抽象类里实现为!equal,这样在其子类里就需要再实现unequal了。
个人来说更喜欢抽象类一点儿(可是Java不支持多继承)。比如Compareable接口其实还有一个要求,如果a<b && b < c 则 a < c,接口里不能保证这是正确的。当然抽象类也解决不了,但是对于上面的Equal,抽象类实现起来更符合额外的要求。
回答6:例子:基于:spring mvc
public abstract class BaseController { protected HttpServletRequest request; protected HttpServletResponse response; protected HttpSession session; @ModelAttribute public void setReqAndResp(HttpServletRequest request, HttpServletResponse response){this.request = request;this.response = response;this.session = request.getSession(); } protected Map<String,String> getLoginUser(){Object loginUser = request.getAttribute(Config.LOGIN_USER);Map<String,String> loginUserMap = new HashMap<>();loginUserMap.put(Config.USER_CODE,loginUser==null?'':loginUser.toString());return loginUserMap; //return (User) session.getAttribute(Constants.LOGIN_USER); }}
通用的全局属性 request response session 通用的方法getLoginUser() 当然 还会有其它的(一些通用的属性和方法)。 既然有controller 那么service dao 也可以。我一般都 是把一些重置的代码 抽到父类里 使用。
相关文章:
1. javascript - 引入 simditor,但是显示标签,这个怎么解决。2. docker api 开发的端口怎么获取?3. android - 目前有哪些用Vue.js开发移动App的方案?4. cas项目起个名字5. javascript - js写一个递归把数据结构重组成另外的结构6. python - scrapy获取网页指定内容,后翻到下一页继续,固定循环次数。。问题7. apache - 装上IIS后WAMP就不能用了8. javascript - 仿着echarts官网的地图做了个例子,但是只显示出来了地点,没有画出飞机动态效果??急9. java - android studio的安装路径问题10. background属性顺序?