当前位置: 技术问答>java相关
java基本概念的问题
来源: 互联网 发布时间:2014-12-31
本文导语: 困惑1: 类ServletOutputStream是抽象类, (public abstract class ServletOutputStream extends java.io.OutputStream)按定义是不能实例化的但是书上又有如下的语句 ServletOutputStream sos=response.getOutputStream(); (其中response是一HttpServletRespon...
困惑1:
类ServletOutputStream是抽象类,
(public abstract class ServletOutputStream extends java.io.OutputStream)按定义是不能实例化的但是书上又有如下的语句
ServletOutputStream sos=response.getOutputStream();
(其中response是一HttpServletResponse),显然sos是一个对象,这是怎么回事?
困惑2:
形如如下的语句
HttpSession session=request.getSession(true);
(request是一个HttpServletRequest)
HttpSession是接口,session是一个实现了这个接口的对象
那么session究竟属于哪个类?
类ServletOutputStream是抽象类,
(public abstract class ServletOutputStream extends java.io.OutputStream)按定义是不能实例化的但是书上又有如下的语句
ServletOutputStream sos=response.getOutputStream();
(其中response是一HttpServletResponse),显然sos是一个对象,这是怎么回事?
困惑2:
形如如下的语句
HttpSession session=request.getSession(true);
(request是一个HttpServletRequest)
HttpSession是接口,session是一个实现了这个接口的对象
那么session究竟属于哪个类?
|
你得理解抽象类和接口的含义。抽象类是包含一些共有属性和空的方法的类,接口是只有空方法的对象定义。他们不能直接实例化,但可以通过他们来得到他们子类的对象。一个类扩展了抽象类或接口,也就是该类必须实现该接口或抽象类的所有方法,而该类同样是含有该抽象类和该接口。采用这种方式来得到一个子类的对象是由于方法的重载。从而可以动态地调用不同的对象。考查两个类servoutputstream1和servoutputstream2都扩展了类ServletOUtputStream。但他们实现的方法内容是不同的。通过这一句,ServletOutputStream sos=response.getOutputStream();无论response得到是sevoutputstream1还是servoutputstream2的实例,都可以赋给对象sos,因为它是他们的父类。而在调用方法的时候,由于重载,将调用实际上真正被获得的子类的方法。所以,抽象类只是提供一种规范的接口,你的类只要满足了这些规范(继承该类),就能实现该类所规定的功能。而不能你是采用什么具体的类来做,在程序运行中会自动根据你的程序真正实例化的子类来得到真正的实例化对象。接口也是如此。只是接口没有属性,比抽象类更加的自由。接口可以说是java的精髓。没办法一下子说清楚。session只是你实现了这个接口的子类的对象,用接口只是因为要实现该功能只需要有该接口的方法就行,而不需要知道其他的关于该对象的属性和方法。至于调用的具体方法是那一个类的,将由你得到的实例化字类对象来决定。
|
不能实例化是指不能用new操作符对其进行实例化