在继承关系下,父类中的this关键字并不总是表示父类中的变量和方法。this关键字的四种用法如前文所述,列举如下。

1) this(paras…); 访问其他的构造方法 
2) this.xxx; 访问类中的成员变量xxx 
3) this.yyy(paras…); 访问类中的成员方法yyy 
4) this; 当前类对象的引用 
对第一种,无论子类是否有相同参数的构造方法,this(paras…);访问的始终是父类中的构造方法。 
对第二种,无论子类是否有覆盖了该成员变量,this.xxx;访问的始终是父类中的成员变量。 
对第三种,如果子类重写了该成员方法,则this.yyy(paras…);访问的是子类的成员方法,如果子类没有重写该成员方法,则this.yyy(paras…);访问的是父类的成员方法。 
对第四种,this始终代表的是子类的对象。

举例论证:

package Test_This;

public class Demo {
public static void main(String[] args) {
Fu f = new Zi(); System.out.println(f.num);//这里定义的是父类,而成员变量没有多态,所以即使你new的子类,依然指向父类的成员变量。
System.out.println(f.fun1());//不解释了,就是多态。
f.show();
}
} class Fu {
public String num = "父类成员变量";
public void show() {
System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
System.out.println(this.fun1());//因为方法有多态,所以this指向new对象的方法。
} public String fun1() {
System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
return "父类调用";
}
} class Zi extends Fu {
public String num = "子类成员变量"; public String fun1() {
System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
return "子类调用";
}
}

运行结果

以上代码实验结果即可证明其论证;

在web开发中可以用这一特性,结合反射来抽取servlet方法

上代码:这个是父类

import java.io.IOException;
import java.lang.reflect.Method; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class BaseServlet extends HttpServlet { @Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
} @Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // localhost:8080/Test/productServlet?method=addProduct
String method = req.getParameter("method"); if (null == method || "".equals(method) || method.trim().equals("")) {
method = "execute";
} // 注意:此处的this代表的是子类的对象
System.out.println("baseservlet this");
System.out.println(this);
// 子类对象字节码对象
Class clazz = this.getClass(); try {
// 查找子类对象对应的字节码中的名称为method的方法.这个方法的参数类型是:HttpServletRequest.class,HttpServletResponse.class
Method md = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
if (null != md) {
String jspPath = (String) md.invoke(this, req, resp);
if (null != jspPath) {
req.getRequestDispatcher(jspPath).forward(req, resp);
}
}
} catch (Exception e) {
e.printStackTrace();
}
} // 默认方法
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
return null;
} }

子类:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import cn.itcast.domain.User;
import cn.itcast.service.IUserService;
import cn.itcast.service.serviceImp.UserServiceImp;
import cn.itcast.utils.MyBeanUtils;
import cn.itcast.utils.UUIDUtils;
import cn.itcast.web.base.BaseServlet; public class UserServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
public String registUI(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return "/jsp/register.jsp";
}
//regist
public String regist(HttpServletRequest request, HttpServletResponse response) throws Exception { //接受用户的表单数据,将其封装到一个对象User上
User user=MyBeanUtils.populate(User.class, request.getParameterMap());
user.setUid(UUIDUtils.getId());
user.setCode(UUIDUtils.getUUID64());
System.out.println(user);
//调用sevice用户注册功能
IUserService userService=new UserServiceImp();
userService.regist(user);
//转发到个提示页面info.jsp
request.setAttribute("msg", "用户注册成功,请激活");
return "/jsp/info.jsp"; } //active
public String active(HttpServletRequest request, HttpServletResponse response) throws Exception {
//获取用户的激活码
String code = request.getParameter("code");
//调用SERVICE层激活功能,返回用户对象
IUserService userService=new UserServiceImp();
User user=userService.active(code);
System.out.println(user);
if(null!=user) {
//如果用户不为空,可以激活,更改用户的状态,清空用户的激活码,向request放入提示消息,转发到登录页面
user.setState(1);
user.setCode("");
userService.updateUser(user);
request.setAttribute("msg", "用户激活成功,请登录");
return "/jsp/login.jsp";
}else {
//如果用户为空,可以失败,向request放入提示消息,转发到info.jsp页面
request.setAttribute("msg", "用户激活失败,请重新激活");
return "/jsp/info.jsp";
}
}
//loginUI
public String loginUI(HttpServletRequest request, HttpServletResponse response) throws Exception {
return "/jsp/login.jsp";
}
//用户登录
//login
public String login(HttpServletRequest request, HttpServletResponse response) throws Exception {
//接受表单参数
User user=MyBeanUtils.populate(User.class, request.getParameterMap());
//调用业务层登录功能,返回用户对象
IUserService userService=new UserServiceImp();
User uu=userService.login(user);
if(null!=uu) {
//用户名不为空,登录成功,将登录成功的用户放入session,重定向到项目首页
request.getSession().setAttribute("user", uu);
response.sendRedirect("/store_v4/index.jsp");
return null;
}else {
//用户名为空,登录失败,向request中放入提示消息,转发/jsp/info.jsp
request.setAttribute("msg", "用户登录失败,请重新登录");
return "/jsp/info.jsp";
}
}
//logOut
public String logOut(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.getSession().invalidate();
response.sendRedirect("/store_v4/index.jsp");
return null;
}
}

当我们需要增加一个有关Test的请求时,我们可以直接在TestServlet中添加相关方法,而不比再写一个Servlet类。但是请求的时候记得要带上method方法参数。

Java继承体系中this的表示关系的更多相关文章

  1. 关于Java继承体系中this的表示关系

    Java的继承体系中,因为有重写的概念,所以说this在子父类之间的调用到底是谁的方法,或者成员属性,的问题是一个值得思考的问题; 先说结论:如果在测试类中调用的是子父类同名的成员属性,这个this. ...

  2. 从基层容器类看万变不离其宗的JAVA继承体系

    以容器类为例子,可以观一叶而知秋,看看以前的前辈们是如何处理各种面向对象思想下的继承体系的.读的源代码越多,就越要总结这个继承关系否则读的多也忘得快. 首先摆上一张图片: 看到这张图很多人就慌了,难道 ...

  3. C++ 继承体系中的名称覆盖

    首先一个简单的样例: int x; int f() { double x; cin >> x; return x; } 在上述代码中.函数f的局部变量x掩盖了全局变量x.这得从 " ...

  4. C++继承体系中的内存对齐

    本篇随笔讨论一个比较冷门的知识,继承结构中内存对齐的问题,如今内存越来越大也越来越便宜,大部分人都已经不再关注内存对齐的问题了.但是作为一个有追求的技术人员,实现功能永远都是最基本的要求,把代码优化到 ...

  5. Java继承多态中的方法访问权限控制

    java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...

  6. C++继承体系中的内存分段

    ---------------综述与目录-------------- 讨论这个问题之前我们先明确类的结构,一个类的大概组成,下面的很多分类名词都是我个人杜撰,为的就是让读者看懂能够区分,下面分别分类: ...

  7. JAVA继承:编译与运行的关系(编译看左边,运行看右边)

    "成员变量,静态方法看左边:非静态方法:编译看左边,运行看右边." 意思是:当父类变量引用子类对象时(Fu f = new Zi();),在这个引用变量f指向的对象中,他的成员变量 ...

  8. Java 继承、抽象、接口

    一.继承 1. 概述 继承是面向对象的重要特征之一,当多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那多个类中无需再定义这些属性和行为,只需继承那个单独的类即可. 单独的类称为父类或超 ...

  9. Java IO体系之RandomAccessFile浅析

    Java IO体系之RandomAccessFile浅析 一.RandomAccessFile综述: 1.1RandomAccessFile简介 RandomAccessFile是java Io体系中 ...

随机推荐

  1. redis 指定端口 启动

    由于资源紧张 需要多创建一个redis实例 重新copy一份实例,然后修改redis.conf文件, 找到port 6379 处修改 端口号 6380 通过下面命令启动就好了 src/redis-se ...

  2. poj 3923 模拟

    /* 1.判断是否是一个完整边框 2.判断是否长度和宽度小于3 3.判断是否有内部覆盖的现象 */ #include<stdio.h> #define N 110 #define inf ...

  3. hdu 1874 dijkstra 队列实现 比数组高效特别在稀疏图

    参考  http://blog.csdn.net/zhuyingqingfen/article/details/6370561 刘汝佳白皮书 #include<stdio.h> #incl ...

  4. -sql语句练习50题(Mysql学习练习版)

    –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课 ...

  5. jQuery通过event获取点击事件的事件对象

    要想搞明白js的事件机制,必须搞清楚几个概念:事件对象,事件源,还有事件流 事件对象: 当事件发生时会产生事件对象,事件对象的作用是用来记录“事件发生是一些相关的信息.注意事件对象只有在事件发生时才会 ...

  6. HDU——4738 Caocao's Bridges

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. 函数式语言(functional language)定义、函数式语言的种类以及为什么函数式语言会流行起来的学习笔记

    一.什么是函数式语言?       函数式语言一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据结构的能力,可以把某一数据 ...

  8. Oracle Multitenant Environment (五) Create PDB

    Creating and Removing PDBs with SQL*Plus This chapter contains the following topics: About Creating ...

  9. Flume NG源代码分析(二)支持执行时动态改动配置的配置模块

    在上一篇中讲了Flume NG配置模块主要的接口的类,PropertiesConfigurationProvider提供了基于properties配置文件的静态配置的能力,这篇细说一下PollingP ...

  10. Java遍历一个文件夹下的全部文件

    Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其它流类不同的是,流类关心的是文件的内容.而File类关心的是磁盘上文件的存储. 一,File类有多个构造器,经常 ...