在java servlet编程中,我们经常碰到HttpSession session = request.getSession()这句代码,获取到一个session对象。
查看HttpSession源码可以发现,这是个接口类public interface HttpSession,这也就是说HttpSession对象是不能直接用new HttpSession ()获取的。
那么我们再来看getSession()这个方法,查看HttpServletRequest的源码可以发现,这也是个interfacce接口类,也是不能直接创建对象的。
那么到这我们可以判断,这里充分利用了java中的多态这个特性,我们这里所看到的传入的request对象和session对象并不是由HttpServletRequest和HttpSession 直接new出来的对象,而是继承了他们的子类对象,由于接口的特性(继承了接口的类需要重写接口的所有方法),然后子类返回一个子类的对象(可用父类接口强转),这样我们用接口定义的接收一个对象表面上看起来似乎就是接口对象直接创建的,实际上是它的一个实现类,但是含有所需的方法并且实现由它们,这个就是多态。
class Demo11_3 { public static void method(DemoA A){ //光从参数上看我们会以为传入的是一个直接的interface对象,实际上传入的是它的子类对象,并且已经实现了方法
A.printHello(); } public static void main(String[] args) throws IOException { Demo11_3.method(new DemoB()); } } interface DemoA{ public final static String name = "Tom"; public DemoA getDemoA(); public void printHello(); } class DemoB implements DemoA{ @Override public DemoA getDemoA() { // TODO Auto-generated method stub return (DemoA)new DemoB(); } @Override public void printHello() { // TODO Auto-generated method stub System.out.println("Hello"); } }